Trong khi không có sự khác biệt khi sử dụng INNER NỐI, như VR46 chỉ ra, có một sự khác biệt đáng kể khi sử dụng outer joins và đánh giá một giá trị trong bảng thứ hai (đối với trái tham gia - Bàn đầu tiên cho quyền tham gia). Hãy xem xét các thiết lập sau:
DECLARE @Table1 TABLE ([ID] int)
DECLARE @Table2 TABLE ([Table1ID] int, [Value] varchar(50))
INSERT INTO @Table1
VALUES
(1),
(2),
(3)
INSERT INTO @Table2
VALUES
(1, 'test'),
(1, 'hello'),
(2, 'goodbye')
Nếu chúng ta chọn từ nó sử dụng một trái bên ngoài tham gia và đặt một điều kiện trong mệnh đề where:
SELECT * FROM @Table1 T1
LEFT OUTER JOIN @Table2 T2
ON T1.ID = T2.Table1ID
WHERE T2.Table1ID = 1
Chúng tôi nhận được kết quả như sau:
ID Table1ID Value
----------- ----------- --------------------------------------------------
1 1 test
1 1 hello
Điều này là do mệnh đề where giới hạn tập hợp kết quả, vì vậy chúng tôi chỉ bao gồm các bản ghi từ bảng 1 có ID là 1.Tuy nhiên, nếu chúng ta di chuyển điều kiện để về khoản:
SELECT * FROM @Table1 T1
LEFT OUTER JOIN @Table2 T2
ON T1.ID = T2.Table1ID
AND T2.Table1ID = 1
Chúng tôi nhận được kết quả như sau:
ID Table1ID Value
----------- ----------- --------------------------------------------------
1 1 test
1 1 hello
2 NULL NULL
3 NULL NULL
Điều này là do chúng ta không còn lọc các kết quả thiết lập bởi ID của table1 trong tổng số 1 - đúng hơn là chúng ta đang lọc JOIN. Vì vậy, mặc dù ID table1 của 2 DOES có một kết quả phù hợp trong bảng thứ hai, nó bị loại trừ khỏi phép nối - nhưng không phải là tập kết quả (do đó các giá trị null).
Vì vậy, để tham gia vào bên trong nó không quan trọng, nhưng bạn nên giữ nó trong mệnh đề where để dễ đọc và nhất quán. Tuy nhiên, đối với các kết nối bên ngoài, bạn cần lưu ý rằng nó KHÔNG quan trọng khi bạn đặt điều kiện vì nó sẽ tác động đến tập kết quả của bạn.
Đơn giản ** KHÔNG ** khác biệt –
Thử tham gia trái, sau đó bạn sẽ bắt đầu thấy sự khác biệt. – sstan
Bạn đã thử một showplan để xem đường dẫn được thực hiện cho cả hai? – scrappedcola