2012-10-10 36 views
9

Một số mã SQL:Nhiều outer joins ngữ nghĩa

SELECT * 
FROM table1 tab1 
    LEFT OUTER JOIN table2 tab2 ON (tab1.fg = tab2.fg) 
    LEFT OUTER JOIN table4 tab4 ON (tab1.ss = tab4.ss) 
    INNER JOIN table3 tab3 ON (tab4.xya = tab3.xya) 
    LEFT OUTER JOIN table5 tab5 ON (tab4.kk = tab5.kk) 

Tôi biết những gì loại khác nhau của câu lệnh JOIN làm, nhưng những gì tôi muốn biết là: cho mỗi JOIN, mà bảng giả định vai trò của "LEFT " bàn? Liệu table1 luôn có vai trò của bảng "TRÁI"?

+1

[Đây là giải thích trực quan tốt về các kết nối] (http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html) – Taryn

+2

Có vẻ thú vị, nhưng tôi vẫn không chắc chắn ngữ nghĩa là gì trong trường hợp có nhiều phép nối. – Howie

Trả lời

14

Chúng được xử lý theo thứ tự từ trên xuống dưới, với các kết nối tất cả liên kết với "toàn bộ" của mệnh đề FROM trước đó.

Tất cả mọi thứ là như nhau:

  • tab1 là đối tác bắt buộc đối với các OUTER JOIN với tab2 đối tác bắt buộc
  • ở trên là đối tác bắt buộc đối với các OUTER JOIN với tab4 đối tác bắt buộc
  • ở trên và tab4 là cả hai đối tác bắt buộc trong INNER JOIN
  • bên trên là đối tác bắt buộc cho OUTER JOIN với tab đối tác tùy chọn5

Tuy nhiên, vấn đề với truy vấn này

SELECT * 
FROM table1 tab1 
LEFT OUTER JOIN table2 tab2 ON tab1.fg = tab2.fg 
LEFT OUTER JOIN table4 tab4 ON tab1.ss = tab4.ss 
INNER JOIN table3 tab3 ON tab4.xya = tab3.xya 
LEFT OUTER JOIN table5 tab5 ON tab4.kk = tab5.kk 

Đó có phải là INNER JOIN với table3 sử dụng một điều kiện đòi hỏi tab4 để tham gia, làm cho nó hầu như một liên kết bắt buộc phải giữ lại hồ sơ từ phía bên trái, vì vậy trong tổng tab1/tab4/tab3 phải tham gia thành công, với tab2 và tab5 tùy chọn.

+1

Bạn có ý nghĩa gì bởi "Tất cả mọi thứ đều bình đẳng"? Điều gì sẽ là một ví dụ trong trường hợp này không phải "tất cả mọi thứ đều bình đẳng"? –

+0

Thứ tự các cột trong vấn đề so sánh bình đẳng là gì? – user180940