2012-02-02 3 views
0

다음 T를 수행하는 방법을 알 수 없기 때문에 나머지 머리카락을 꺼내는 데 가깝습니다. -SQL 음속 2.2 쿼리 :. 나는 적어도 10 개 가지 방법으로 다음과 같은 음속 선택을 시도했습니다아음속 쿼리 조건 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 

,하지만 난 그게 동일한 결과를 얻을

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

을, 당신은 괜찮을 음속을 선택, 그냥 (대신 WhereExpressionWhere을 사용하는지 SQL을 얻을 수 있습니까?).

마술 문자열 대신 강하게 입력 된 열을 사용하는 것이 좋습니다. 이것이 바로 SubSonic 사용의 장점 중 하나입니다.

+0

그게 다 가깝습니다. 첫 번째 AND 후 다른 괄호를 열지 않습니다. WHERE ([dbo]. [vSalesRepCommissionGrouped]. [UserID] IN (UserID0In1, UserID0In2, UserID0In3)) AND ([dS]. [vSalesRepCommissionGrouped]. [SurgeryDate] > 수술 날짜 및 [dbo]. [수술 날짜]. [수술 날짜] <= 수술 날짜 및 수술 날짜. [수술실 날짜]. [수술 날짜]> = 수술 날짜 및 [수술 도구]. [수술 일 수] 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 또는 [SurgeryDate]> = SurgeryDate3 AND [SurgeryDate] <= SurgeryDate4 AND [POReceivedOn]> = POReceivedOn5)'**는 ** '** 사용자 ID IN (5,6,20) AND (SurgeryDate> ='2012-01-01 AND SurgeryDate <= '2012-01-31'또는 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 AND [DBO] vSalesRepCommissionGrouped] SurgeryDate] <= SurgeryDate1) OR ([DBO] vSalesRepCommissionGrouped] [수술 날짜]와 수술 날짜 [수술 그룹 날짜], [외과 수술 날짜], [외과 수술 날짜], [외과 수술 날짜], [외과 수술 날짜] UserID] IN (UserID7In1, UserID7In2, UserID7In3)) ' – ajtatum

1

나를 괴롭히지 만,이 시점에 도달하면 보통 SqlConnection 개체를 SQL 직접 전달로 사용합니다. SubSonic 2가 이러한 복잡함에 부합하는지 확신 할 수 없습니다.

아음속 쿼리에서 사용하고있는 괄호가 실제로 아무 것도하지 않는다고 생각합니다. 그것들은 기준의 구문 분석 순서에 영향을 미칠 수 있지만 최종 SQL 구문의 구성에는 영향을 미치지 않을 수 있습니다 (적어도 감각적으로 제어 가능한 방식이 아님).

SubSonic 3은 AndAlso 연산자를 가져 와서 괄호를 시뮬레이트하지만, 심지어 매우 조잡합니다. LINQ (SubSonic 3에서 지원됨)는이를 안정적으로 수행하는 유일한 방법 일 수 있습니다.