Trong blog của Craig Freedman, Nested Loops Tham gia , anh giải thích lý do tại sao các vòng lặp lồng nhau không thể hỗ trợ tham gia bên ngoài bên phải:
Vấn đề là chúng tôi quét bảng bên trong nhiều lần - một lần cho mỗi hàng của phép nối ngoài. Chúng tôi có thể gặp cùng một hàng bên trong nhiều lần trong nhiều lần quét này. Tại thời điểm nào chúng ta có thể kết luận rằng một hàng bên trong cụ thể không hoặc sẽ không tham gia?
Ai đó có thể vui lòng giải thích điều này một cách thực sự đơn giản và giáo dục?
Có nghĩa là vòng lặp bắt đầu với bảng bên ngoài ( R1
) và quét bên trong ( R2
)?
Tôi hiểu rằng đối với một R1
giá trị không tham gia cùng R2
, nó nên được thay thế bằng một NULL
tập hợp kết quả trở thành ( NULL, R2
). Đối với tôi dường như không thể trả lại một R2
giá trị khiR1
không tham gia, vì lý do là nó không thể biết R2
giá trị nào sẽ trả về. Nhưng đó không phải là cách nó được giải thích. Hoặc là nó?
SQL Server thực tế tối ưu hóa (và thường thay thế) RIGHT JOIN
bằng LEFT JOIN
, nhưng câu hỏi là để giải thích tại sao về mặt kỹ thuật không thể NESTED LOOPS JOIN
sử dụng / hỗ trợ RIGHT JOIN
logic.