2012-06-22 7 views
7

이전 스타일 구문을 사용하는 쿼리를 새 조인 구문으로 변환하는 중입니다. 다음과 같이 내 쿼리의 본질은 다음과 같습니다SQL 내부 조인. ON 조건과 WHERE 절

원래 쿼리

SELECT i.* 
FROM 
    InterestRunDailySum i, 
    InterestRunDetail ird, 
    InterestPayments p 
WHERE 
    p.IntrPayCode = 187 
    AND i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode 
    AND ird.IntRunCode = p.IntRunCode AND ird.ClientCode = p.ClientCode 

새 쿼리

SELECT i.* 
    FROM InterestPayments p 
    INNER JOIN InterestRunDailySum i 
     ON (i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode) 
    INNER JOIN InterestRunDetail ird 
     ON (ird.IntRunCode = p.IntRunCode AND ird.IntRunCode = p.IntRunCode) 
    WHERE 
    p.IntrPayCode = 187 

을이 예에서 "기존 쿼리는" "새 쿼리는"이상 반환 46 개 행을 반환 800

다른 사람이 나에게 그 차이점을 설명 할 수 있습니까? 나는이 쿼리가 동일하다고 가정했을 것이다.

답변

17

문제가 InterestRunDetail에 참여하는 것입니다. IntRunCode에 두 번 참여하고 있습니다.

올바른 쿼리해야합니다 :

SELECT i.* 
    FROM InterestPayments p 
    INNER JOIN InterestRunDailySum i 
     ON (i.IntRunCode = p.IntRunCode AND i.ClientCode = p.ClientCode) 
    INNER JOIN InterestRunDetail ird 
     ON (ird.IntRunCode = p.IntRunCode AND ird.ClientCode = p.ClientCode) 
    WHERE 
    p.IntrPayCode = 187 
+1

Kevin, 고맙습니다. 나는 그것을 발견하지 못한 바보처럼 느낍니다 !! – Russell

+2

그것은 우리 모두에게 일어납니다. :-) –

4

"새 쿼리"에 대한 조인 현재 ANSI SQL 표준과 호환 하나입니다. 실수 데카르트가 없습니다 -

  • 는 거의 생각하고 두 테이블 사이의 조건 (들) 가입 지정할 강제 :

    또한, 나는 많은 쿼리 # 2 청소기을 찾을 수 제품을 검색합니다. 열 개의 테이블을 나열하는 경우, WHERE 절에 여섯 개의 조인 조건 만 있으면 더 많은 데이터가보다 많이 반환됩니다.

  • 당신의 WHERE 절에 어수선하게하지 않는 조건에 가입하고 따라서 그것은 청소기의 적은, 지저분한 쉽게 읽고 이해의

  • 유형하여 일반적으로 (CROSS JOIN, LEFT OUTER JOIN, INNER JOIN 여부) 가입 훨씬 쉽게 볼 수 있습니다. # 1 - "오래된 스타일"구문으로, 그 차이는 조인 유형은 기능적으로

은, 두 사람은 동일하다 ..... WHERE 기준하여 많은 어딘가에 묻혀 볼 오히려 어렵다 조만간 일부 쿼리 엔진에서 더 이상 사용되지 않을 수 있습니다.

또한 추가 정보를 원하시면 아론 버트 랜드의 우수한 Bad Habits to Kick - using old-style JOIN syntax 블로그 게시물을 참조 - 당신이 그것에있어 - 모든 그것은 매우 가치 - 에게 게시물을 모두 "걷어차 나쁜 습관"를 읽어!

+1

좋은 답변 -하지만 그의 검색어는 실제로 동일하지 않습니다 - 그냥 오타였던 것처럼 보입니다 ;-) –