Về mặt logic, các phép nối được giải quyết theo thứ tự các ON
mệnh đề từ trái sang phải.
Đầu ra của mỗi phép nối là một bảng ảo đi vào phép nối tiếp theo.
Vì vậy, đối với truy vấn trong câu hỏi của bạn, kết quả bảng ảo A LJ B
sau đó được nối ngay vào C
. Điều kiện nối B.Col3 = C.Col4
sẽ mất bất kỳ hàng mở rộng null nào được bảo toàn bởi liên kết bên trái ban đầu có hiệu quả biến liên kết đầu tiên trở lại tham gia bên trong và bảng ảo kết quả (bảo tồn tất cả các hàng từ đó C
) sau đó được nối bên trong D
.
Vì vậy, truy vấn ban đầu của bạn có thể được đơn giản hóa như
SELECT *
FROM TBLA A
INNER JOIN TBLB B ON A.Col1 = B.Col2
RIGHT JOIN TBLC C ON B.Col3 = C.Col4
JOIN TBLD D ON C.Col5 = D.Col6
Đó là hiệu quả tương tự như (A IJ B) ROJ (C IJ D)
Thứ tự của các ON
mệnh đề không nhất thiết giống như thứ tự các bảng xuất hiện trong truy vấn. Điều này cũng có thể được viết lại như(C IJ D) LOJ (A IJ B)
SELECT *
FROM TBLC C
INNER JOIN TBLD D
ON C.Col5 = D.Col6
LEFT JOIN TBLA A
INNER JOIN TBLB B
ON A.Col1 = B.Col2
ON B.Col3 = C.Col4
Vị trí của các mệnh đề trên có nghĩa là phép nối ngoài được thực hiện giữa hai bảng ảo kết quả từ (C IJ D)
và (A IJ B)
thay vì chỉ trên một bảng duy nhất.
Trong truy vấn thứ hai của bạn về mặt khái niệm, bảng ảo A x C
được nối vào B bảo toàn toàn bộ sản phẩm cartesian, sau đó kết quả của nó được nối D
với vị từ C.Col5 = D.Col6
. Điều này giúp loại bỏ bất kỳ hàng nào khỏi kết quả cuối cùng không tham gia bên trong giữa C
và D
có nghĩa là nó tương đương với
SELECT *
FROM TBLC C
JOIN TBLD D
ON C.Col5 = D.Col6
CROSS JOIN TBLA A
LEFT JOIN TBLB B
ON A.Col1 = B.Col2
AND B.Col3 = C.Col4