Một cách hiệu quả, WHERE
điều kiện và JOIN
điều kiện cho [INNER] JOIN
tương đương 100% trong PostgreSQL. (Bạn nên sử dụng JOIN
rõ ràng tuy nhiên, điều kiện để làm cho truy vấn dễ đọc và dễ bảo trì hơn).
Tương tự là không true cho một LEFT JOIN
được kết hợp với WHERE
điều kiện trên một bảng ở bên phải của phép nối. Mục đích của LEFT JOIN
là bảo toàn tất cả các hàng ở phía bên trái của phép nối, không có bất thường đối với kết quả khớp ở phía bên phải. Nếu không tìm thấy kết quả phù hợp nào, hàng sẽ được mở rộng bằng NULL
giá trị cho các cột ở phía bên phải. Hướng dẫn sử dụng:
LEFT OUTER JOIN
Đầu tiên, một phép nối bên trong được thực hiện. Sau đó, đối với mỗi hàng trong T1 không thỏa mãn điều kiện nối với bất kỳ hàng nào trong T2, một hàng đã nối sẽ được thêm với giá trị null trong các cột của T2. Do đó, các đường bảng đã kết hợp có ít nhất một hàng cho mỗi hàng trong T1.
Nếu sau đó bạn áp dụng WHERE
điều kiện yêu cầu một cái gì đó khác ngoài NULL
giá trị trên các cột của bảng ở phía bên phải, bạn sẽ vô hiệu hóa hiệu ứng và buộc chuyển đổi LEFT [OUTER] JOIN
để hoạt động như một [INNER] JOIN
đơn giản , chỉ (có thể) tốn kém hơn do kế hoạch truy vấn phức tạp hơn.
Trong một truy vấn có nhiều bảng được kết hợp, Postgres (hoặc bất kỳ RDBMS nào) rất khó tìm ra kế hoạch truy vấn tốt nhất (hoặc thậm chí là tốt). Số lượng các trình tự có thể có về mặt lý thuyết để nối các bảng tăng lên về mặt thực tế (!). Postgres sử dụng "Trình tối ưu hóa Truy vấn Chung" cho nhiệm vụ và có một số cài đặt ảnh hưởng đến nó.
Làm xáo trộn truy vấn bằng LEFT JOIN
gây hiểu lầm như đã nêu, làm cho công việc của trình lập kế hoạch truy vấn khó khăn hơn, gây hiểu lầm cho người đọc và thường gợi ý về các lỗi trong logic truy vấn.
Câu trả lời liên quan cho các vấn đề bắt nguồn từ điều này:
- Tại sao null bằng số nguyên trong WHERE?
- Truy vấn với LEFT JOIN không trả về các hàng có số lượng là 0
- Truy vấn SQL sử dụng kết nối bên ngoài và giới hạn các bản ghi con cho mỗi phụ huynh
- Liên kết bên ngoài trái hoạt động giống như liên kết bên trong
- Chọn các hàng không có trong bảng khác
Vv.