Tôi nhận được các kết quả khác nhau dựa trên điều kiện bộ lọc trong truy vấn dựa trên nơi tôi đặt điều kiện bộ lọc. Câu hỏi của tôi là:Tiêu chuẩn SQL về tham gia bên ngoài trái và điều kiện ở đâu
- Có sự khác biệt về kỹ thuật giữa các truy vấn này không?
- Có bất kỳ điều gì trong tiêu chuẩn SQL giải thích các tập bản ghi khác nhau từ các truy vấn không?
Với kịch bản đơn giản:
--Table: Parent Columns: ID, Name, Description
--Table: Child Columns: ID, ParentID, Name, Description
--Query 1
SELECT p.ID, p.Name, p.Description, c.ID, c.Name, c.Description
FROM Parent p
LEFT OUTER JOIN Child c ON (p.ID = c.ParentID)
WHERE c.ID IS NULL OR c.Description = 'FilterCondition'
--Query 2
SELECT p.ID, p.Name, p.Description, c.ID, c.Name, c.Description
FROM Parent p
LEFT OUTER JOIN Child c
ON (p.ID = c.ParentID AND c.Description = 'FilterCondition')
tôi cho rằng các truy vấn sẽ trả lại resultsets cùng và tôi đã rất ngạc nhiên khi họ không. Tôi đang sử dụng MS SQL2005 và trong các truy vấn thực tế, truy vấn 1 trả về ~ 700 hàng và truy vấn 2 trả về ~ 1100 hàng và tôi không thể phát hiện mẫu mà hàng được trả lại và hàng nào bị loại trừ. Vẫn còn nhiều hàng trong truy vấn 1 với hàng con với dữ liệu và dữ liệu NULL. Tôi thích kiểu truy vấn 2 (và tôi nghĩ nó tối ưu hơn), nhưng tôi nghĩ các truy vấn sẽ trả lại kết quả tương tự.
Edit/Tóm tắt:
Đã có một số câu trả lời lớn được cung cấp ở đây. Tôi đã có một thời gian khó khăn để lựa chọn ai để trao giải đáp. Tôi quyết định đi với mdma vì đó là câu trả lời đầu tiên và là câu trả lời rõ ràng nhất. Dựa trên câu trả lời cung cấp, đây là tóm tắt của tôi:
kết quả có thể xảy ra:
- Một: Phụ huynh không có con
- B: Cha mẹ với con cái
- | -> B1: Phụ huynh với trẻ em nơi không có trẻ em nào phù hợp với bộ lọc
- \ -> B2: Cha mẹ có trẻ em từ 1 trở lên phù hợp với bộ lọc
kết quả truy vấn:
- Query 1 lợi nhuận (A, B2)
- Query 2 lợi nhuận (A, B1, B2)
Query 2 luôn trả về cha mẹ vì sự tham gia bên trái. Trong truy vấn 1, mệnh đề WHERE được thực hiện sau khi kết nối bên trái, vì vậy cha mẹ có con mà không có con nào phù hợp với bộ lọc bị loại trừ (trường hợp B1).
Lưu ý: chỉ thông tin cha mẹ được trả lại trong trường hợp B1 và trong trường hợp B2 chỉ thông tin cha/con phù hợp với bộ lọc được trả về.
HLGEM cung cấp một liên kết tốt:
http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN
Cảm ơn. Tôi hiểu sự khác biệt về hiệu suất, nhưng tôi tò mò hơn về các kết quả khác nhau. – Ryan
@Ryan - Đó không phải là về hiệu suất. Trường hợp lọc được áp dụng có thể làm cho tất cả sự khác biệt về kết quả thích hợp. – Thomas
OK. Cảm ơn. – Ryan