2009-05-04 17 views
5

Hai truy vấn sau đây đang quay trở lại kết quả khác nhau, trước sự ngạc nhiên của tôi:Ưu tiên của nhiều câu lệnh JOIN trong sqlite là gì?

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; 

và:

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; 

Tôi tưởng tượng rằng nó nên không quan trọng khi bạn LEFT JOIN trên zig, kể từ khi tôi m không sử dụng các cột của zig khi tham gia barbaz. Tuy nhiên, có vẻ như sau, JOIN -ing của barbaz nuốt các hàng nơi zig có giá trị null ... tại sao vậy?

+0

Tôi bắt đầu nghi ngờ đây là một sự đơn giản hóa không chính xác về vấn đề của tôi - hai truy vấn đó thực sự phải giống nhau, tôi đã làm một việc khác. –

Trả lời

3

Tính năng này hoạt động tốt. Tôi đã sai.

2

Đây là sự khác biệt vì nơi bạn tham gia bên trái có trong tuyên bố. Hãy nhớ rằng các kết nối không chỉ trên hai bảng mà bạn đang so sánh các trường, mà là tất cả mọi thứ bạn đã tham gia vào điểm đó và bảng tiếp theo.

Vì vậy, trong tuyên bố đầu tiên bạn sẽ lọc ra các hàng từ foo trong bạn lần đầu tham gia (những người không có bar_id = bar.id)

nhưng trong báo cáo thứ hai bạn đã bao gồm tất cả các foo với trái của bạn tham gia.

Điều này khó nói rõ hơn tôi dự đoán khi tôi bắt đầu viết điều này, hãy cho tôi biết nếu nó có ý nghĩa với bạn.

+1

Nhưng ngay cả khi, trong câu lệnh thứ hai, tôi bao gồm tất cả các foo với tham gia bên trái đầu tiên, không nên các hàng tương tự (những hàng không có bar_id) được lọc ra trong tham gia sau? –