Đối với kết nối bên trong, tôi chưa thực sự nhận thấy sự khác biệt (nhưng với tất cả điều chỉnh hiệu suất, bạn cần kiểm tra cơ sở dữ liệu trong điều kiện của mình).
Tuy nhiên, nơi bạn đặt điều kiện tạo ra sự khác biệt lớn nếu bạn đang sử dụng các kết nối trái hoặc phải. Ví dụ: xem xét hai truy vấn sau:
SELECT *
FROM dbo.Customers AS CUS
LEFT JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
WHERE ORD.OrderDate >'20090515'
SELECT *
FROM dbo.Customers AS CUS
LEFT JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
AND ORD.OrderDate >'20090515'
Đầu tiên sẽ chỉ cung cấp cho bạn những bản ghi có thứ tự ngày muộn hơn ngày 15 tháng 5 năm 2009, do đó chuyển đổi tham gia trái sang tham gia bên trong. Thứ hai sẽ cung cấp cho những hồ sơ cộng với bất kỳ khách hàng không có đơn đặt hàng. Tập kết quả rất khác nhau tùy thuộc vào nơi bạn đặt điều kiện. (Chọn * nếu chỉ cho mục đích ví dụ, bạn không nên sử dụng khóa học trong mã sản xuất.) Ngoại lệ cho điều này là khi bạn chỉ muốn xem các bản ghi trong một bảng nhưng không phải là bản ghi khác. Sau đó, bạn sử dụng mệnh đề where cho điều kiện không tham gia.
SELECT *
FROM dbo.Customers AS CUS
LEFT JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
WHERE ORD.OrderID is null
Bạn có chạy hai truy vấn không? Bạn đã kiểm tra các kế hoạch thực hiện do hai truy vấn tạo ra chưa? Bạn đã quan sát điều gì? –
@ S.Lott, truy vấn này chỉ nhằm mục đích ví dụ. Tôi chỉ tự hỏi "nói chung" là phương pháp ưa thích - nếu có. –
@Steve Dignan: Bạn nên đánh giá điều này với dữ liệu mẫu và xem xét các kế hoạch truy vấn. Câu trả lời sẽ rất, rất rõ ràng. Và - tiền thưởng - bạn sẽ có một đoạn mã mà bạn có thể sử dụng lại khi các tình huống phức tạp hơn phát sinh. –