2012-02-02 28 views
0

次のTを実行する方法がわからないので、亜音速の2.2で-SQLクエリ:サブソニッククエリ条件A AND((条件B AND条件C)OR(条件D AND条件E AND条件F)

SELECT SalesRep, Location, InvoiceNumber, PONumber, POReceivedOn, SurgeryDate, Surgeon 
FROM dbo.vSalesRepCommissionGrouped AS vsrcg 
WHERE UserID IN (5, 6, 20) 
    AND ((SurgeryDate >= '2012-01-01' 
      AND SurgeryDate <= '2012-01-31' 
     ) 
      OR (SurgeryDate >= '2011-12-01' 
       AND SurgeryDate <= '2011-12-31' 
       AND POReceivedOn >= '2012-01-01' 
      ) 
     ) 
ORDER BY SurgeryDate ASC 

私は、少なくとも10個の異なる方法で次亜音速の選択をしようとしましたが、私はそれは同じ結果を生成するために取得することはできません

new Select("SalesRep, Location, InvoiceNumber, PONumber, POReceivedOn, SurgeryDate, Surgeon") 
        .From(VSalesRepCommissionGrouped.Schema) 
        .WhereExpression("UserID").In(new[] { 5, 6, 20 }) 
        .AndExpression("SurgeryDate").IsGreaterThanOrEqualTo(BeginDate).And("SurgeryDate").IsLessThanOrEqualTo(EndDate) 
        .Or("SurgeryDate").IsGreaterThanOrEqualTo(BeginDate.AddMonths(-1)).And("SurgeryDate").IsLessThanOrEqualTo(
         EndDate.AddMonths(-1)).And("POReceivedOn").IsGreaterThanOrEqualTo(BeginDate).CloseExpression() 
        .OrderAsc("SurgeryDate"); 

でした誰かしてください。正しい方向に私を向ける?

ありがとうございました! - アンドリュー

答えて

1

実は、あなたが選択亜音速だだけではなく、WhereExpression(何のWhereを使用し、問題ないはずですSQLを入手できますか?)。

また、魔法の文字列の代わりに強く型付けされたSubSonicの列を使用することをお勧めします。これは、SubSonicを使用する利点の1つです。

+0

それは近いです。 [vSalesRepCommissionGrouped]。[ユーザーID] IN(ユーザーID0In1、ユーザーID0In2、ユーザーID03))AND([dbo]。[vSalesRepCommissionGrouped]。[SurgeryDate]。最初のANDの後に別のかっこを開きません。 > [SurgeryDate] <= SurgeryDate2 AND [dbo]。[VSalesRepCommissionGrouped] [SurgeryDate] <= SurgeryDate3 OR [dbo]。[SurgeryDate] dbo]。[vSalesRepCommissionGrouped]。[POReceivedOn]> = POReceivedOn6))ORDER BY SurgeryDate ASC' – ajtatum

+0

'AND'文の前後に括弧を入れる必要はなく、当然OR比較より優先されます。 [T-SQL演算子の優先順位](http://msdn.microsoft.com/en-us/library/ms190276.aspx)も参照してください。 – marapet

+0

奇妙な。それでは: 'どこの[UserID] IN(UserID0In1、UserID0In2、UserID0In3)AND([SurgeryDate]> = SurgeryDate1 AND [SurgeryDate] <= SurgeryDate2またはSurgeryDate3 = SurgeryDate3 <= SurgeryDate4 AND [POReceivedOn]> = (5,6,20)AND(SurgeryDate> = '2012-01-01 AND SurgeryDate <=' 2012-01-31 'OR SurgeryDate> => '2011-12-01 'とSurgeryDate <=' 2011-12-31 'AND POReceivedOn> =' 2012-01-01 ')' – ajtatum

0

私は今テストしたが、このクエリが動作するかどうかを確認してくださいすることはできません。

new Select("SalesRep, Location, InvoiceNumber, PONumber, POReceivedOn, SurgeryDate, Surgeon") 
        .From(VSalesRepCommissionGrouped.Schema) 
        .WhereExpression("SurgeryDate").IsGreaterThanOrEqualTo(BeginDate) 
           .And("SurgeryDate").IsLessThanOrEqualTo(EndDate) 
        .OrExpression("SurgeryDate").IsGreaterThanOrEqualTo(BeginDate.AddMonths(-1)) 
           .And("SurgeryDate").IsLessThanOrEqualTo(EndDate.AddMonths(-1)) 
           .And("POReceivedOn").IsGreaterThanOrEqualTo(BeginDate) 
        .AndExpression("UserID").In(new[] { 5, 6, 20 }) 
        .OrderAsc("SurgeryDate"); 
+0

助けてくれてありがとうございますが、どちらもうまくいきません。ここでは、where句があります:。 'WHERE(。。。。[DBO] [vSalesRepCommissionGrouped] [SurgeryDate]> = SurgeryDate0て[DBO] [vSalesRepCommissionGrouped] [SurgeryDate] <= SurgeryDate1) OR([DBO] [vSalesRepCommissionGrouped] [SurgeryDate] <= SurgeryDate4 AND [dbo]。[vSalesRepCommissionGrouped]。[POReceivedOn]> = POReceivedOn5) AND([dS]。[vSalesRepCommissionGrouped] UserID] IN(UserID7In1、UserID7In2、UserID7In3)) ' – ajtatum

1

私はこの問題にぶつかってしまいますが、この時点では通常、SQLを直接SQLに渡すためにSqlConnectionオブジェクトを使用します。私は、SubSonic 2がこれらの複雑さに対応しているかどうかはわかりません。

また、亜音速のクエリで使用しているカッコが実際に何かをしているとは思われません。これらは、条件の解析順序に影響する可能性がありますが、最終的なSQL文の構築には影響しません(少なくとも、制御可能な方法ではない)。

SubSonic 3はAndAlso演算子を使って括弧をシミュレートしましたが、それでもかなり粗かったです。おそらくこれを確実に行う唯一の方法は、LINQ(SubSonic 3でサポート)です。