Vâng, đó là thứ tự của các hoạt động ..
SELECT
t1.*
FROM
table1 t1
INNER JOIN table2 t2
LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
ON t2.table2_ID = t1.table1_ID
có thể được viết lại như sau:
SELECT
t1.*
FROM
table1 t1 -- inner join t1
INNER JOIN
(table2 t2 LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID) -- with this
ON t2.table2_ID = t1.table1_ID -- on this condition
vì vậy, về cơ bản, trước tiên bạn LEFT JOIN t2 với t3, căn cứ vào điều kiện tham gia: table3_ID = table2_ID, sau đó bạn INNER JOIN t1 với t2 trên table2_ID = table1_ID.
Trong ví dụ thứ hai, bạn đầu tiên INNER JOIN t1 với t2, và sau đó LEFT JOIN kết nối bên trong kết quả với bảng t3 trên bảng điều kiện2_ID = table1_ID.
SELECT
t1.*
FROM
table1 t1
INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID
LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
có thể được viết lại như sau:
SELECT
t1.*
FROM
(table1 t1 INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID) -- first inner join
LEFT JOIN -- then left join
table3 t3 ON t3.table3_ID = t2.table2_ID -- the result with this
EDIT
Tôi xin lỗi. Nhận xét đầu tiên của tôi là sai. Hai truy vấn sẽ tạo ra kết quả tương tự nhưng có thể có sự khác biệt về hiệu suất vì truy vấn đầu tiên có thể hoạt động chậm hơn truy vấn thứ hai trong một số trường hợp (khi bảng 1 chỉ chứa một tập con của các phần tử trong bảng 2). được thực thi đầu tiên - và chỉ sau đó được giao với bảng 1. Trái ngược với truy vấn thứ hai cho phép trình tối ưu hóa truy vấn thực hiện công việc của nó.
Nguồn
2009-07-07 20:23:00
Họ có đưa ra kết quả tương tự khi bạn thực thi chúng không? –
+1 để làm cho tôi đi "Hm ..." – Tomalak
Đó là một heck của rất nhiều dễ dàng hơn để hiểu thứ hai hơn so với cái đầu tiên - ngay cả khi bạn đặt (parens) xung quanh LOJ trong lần đầu tiên. Nhìn về phía trước để bỏ phiếu cho một câu trả lời tốt về điều này. –