2012-02-02 81 views
0

我接近拔出我的頭髮,因爲我無法弄清楚如何做下面的T -SQL查詢在亞音速2.2:亞音速查詢條件A AND((條件B AND條件C)OR(條件D AND條件E和條件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

其實,你是亞音速選擇應該是罰款,只是用Where代替WhereExpression(什麼你會得到SQL嗎?)。

我還推薦使用SubSonic的強類型列而不是魔術字符串 - 這是使用SubSonic的優勢之一。

+0

即將關閉。在第一個AND之後它不打開另一個括號: WHERE([dbo]。[vSalesRepCommissionGrouped]。[UserID] IN(UserID0In1,UserID0In2,UserID0In3))AND([dbo]。[vSalesRepCommissionGrouped]。[SurgeryDate] > = SurgeryDate2 AND [dbo]。[vSalesRepCommissionGrouped]。[SurgeryDate] <= SurgeryDate3 OR [dbo]。[vSalesRepCommissionGrouped]。[SurgeryDate]> = SurgeryDate4 AND [dbo]。[vSalesRepCommissionGrouped]。[SurgeryDate] <= SurgeryDate5 AND [ dbo]。[vSalesRepCommissionGrouped]。[POReceivedOn]> = POReceivedOn6))ORDER BY SurgeryDate ASC' – ajtatum 2012-02-02 21:25:04

+0

'AND'語句不需要括號,它們自然優先於'OR'比較。另請參見[T-SQL運算符優先級](http://msdn.microsoft.com/zh-cn/library/ms190276.aspx)。 – marapet 2012-02-02 21:56:46

+0

奇怪。所以:WHERE [UserID] IN(UserID0In1,UserID0In2,UserID0In3)AND([SurgeryDate]> = SurgeryDate1 AND [SurgeryDate] <= SurgeryDate2 OR [SurgeryDate]> = SurgeryDate3 AND [SurgeryDate] <= SurgeryDate4 AND [POReceivedOn]> = (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')' – ajtatum 2012-02-02 22:59:54

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子句: OR [[dbo]。[vSalesRepCommissionGrouped] WHERE([dbo]。[vSalesRepCommissionGrouped]。[SurgeryDate]> = SurgeryDate0 AND [dbo]。[vSalesRepCommissionGrouped]。[SurgeryDate] <= SurgeryDate1) [SurgeryDate]> = SurgeryDate3 AND [dbo]。[vSalesRepCommissionGrouped]。[SurgeryDate] <= SurgeryDate4 AND [dbo]。[vSalesRepCommissionGrouped]。[POReceivedOn]> = POReceivedOn5) AND([dbo]。[vSalesRepCommissionGrouped]。[ UserID] IN(UserID7In1,UserID7In2,UserID7In3))' – ajtatum 2012-02-02 21:28:16

1

燒死我的股權,但是當它到達這一點時,我通常使用SqlConnection對象作爲直接傳遞SQL。我不確定SubSonic 2是否能夠解決這些錯綜複雜的問題。

我也不認爲你在亞音速查詢中使用的括號實際上是在做任何事情。它們可能會影響標準的解析順序,但不會影響最終SQL語句的構建(至少不是以明智的可控方式)。

SubSonic 3帶來AndAlso算子來模擬圓括號,但即使這樣也很粗糙。 LINQ(支持SubSonic 3)可能是唯一可行的方法。