2009-05-04 4 views
5

다음 두 쿼리는 놀랍게도 다른 결과를 반환됩니다sqlite에서 여러 JOIN 문의 우선 순위는 무엇입니까?

SELECT * 
    FROM foo 
     JOIN bar 
     ON bar.id=foo.bar_id 

     JOIN baz 
     ON baz.id=foo.baz_id 

     LEFT JOIN zig 
     ON zig.foo_id=foo.id; 

과 :

SELECT * 
    FROM foo 
     LEFT JOIN zig 
     ON zig.foo_id=foo.id 

     JOIN bar 
     ON bar.id=foo.bar_id 

     JOIN baz 
     ON baz.id=foo.baz_id; 

나는 그것이 내가 '안하기 때문에 문제가 때 당신에게 LEFT JOINzig에 있다는 상상 해요을 barbaz을 연결할 때 zig의 열을 사용하지 않습니다. 그러나, 후자의 경우 -barbazzignull 값을 갖는 행을 위로 삼킨다는 것을 알 것입니다. 왜 그럴까요?

+0

저는 이것이 내 문제의 부정확 한 단순화라고 생각하기 시작했습니다.이 두 가지 쿼리는 실제로 동일해야하며 다른 작업을 수행하고있었습니다. –

답변

3

잘 작동합니다. 내가 틀렸어.

2

왼쪽 된 조인이 문에 포함되어 있기 때문에 이러한 내용이 다릅니다. 조인은 필드를 비교하는 두 테이블에있는 것이 아니라 그 지점과 다음 테이블에 조인 한 모든 테이블에 있다는 것을 기억하십시오.

그래서 당신이 foo는에서 행을 필터링하는 첫 번째 문에서 첫 번째 문에 당신은 당신의 왼쪽에 foo에 모두 포함되어

하지만 (bar_id = bar.id이없는 것들)에 가입 어울리다.

이 글을 쓰기 시작했을 때 예상했던 것보다 분명히 말하기가 더 어려웠습니다.

+1

하지만 두 번째 명령문에서 첫 번째 왼쪽 조인과 함께 foo를 모두 포함하는 경우에도 후자 조인에서 동일한 행 (bar_id가없는 행)을 필터링하면 안됩니까? –