2011-02-09 28 views
9

Có bất kỳ đối số, hiệu suất khôn ngoan, để lọc trong tham gia, trái ngược với mệnh đề WHERE không?Bật lửa khi tham gia?

Ví dụ,

SELECT blah FROM TableA a 
INNER JOIN TableB b 
ON b.id = a.id 
AND b.deleted = 0 
WHERE a.field = 5 

Trái ngược với

SELECT blah FROM TableA a 
INNER JOIN TableB b 
ON b.id = a.id 
WHERE a.field = 5 
    AND b.deleted = 0 

Cá nhân tôi thích thứ hai, bởi vì tôi cảm thấy lọc nên được thực hiện trong phần lọc (WHERE), nhưng có bất kỳ hoạt động hoặc các lý do khác để thực hiện một trong hai phương pháp?

+0

trùng lặp [WHERE khoản so với ON khi sử dụng JOIN] (https://stackoverflow.com/questions/10297231/where-clause-vs-on-when-using-join) (có, liên quan đến thời gian đi lại nhưng tại nháy mắt có câu trả lời tốt hơn một chút) –

Trả lời

17

Nếu trình tối ưu hóa truy vấn thực hiện công việc của mình, không có sự khác biệt nào cả (ngoại trừ sự rõ ràng cho người khác) trong hai biểu mẫu cho các kết nối bên trong.

Điều đó nói rằng, khi trái tham gia một điều kiện trong tham gia có nghĩa là lọc các hàng ra khỏi bảng thứ hai trước khi tham gia. Một điều kiện ở nơi có nghĩa là để lọc hàng ra khỏi kết quả cuối cùng sau khi tham gia. Những điều đó có ý nghĩa rất khác nhau.

+4

+1. để chỉ ra sự khác biệt –

+0

+1 báo cáo sơ đồ SQL chính xác cùng số lần đọc – kelloti

0

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm >>SQL join: where clause vs. on clause

+0

Nếu bạn cho rằng câu hỏi là trùng lặp, chỉ cần đánh dấu nó là một, thay vì thêm câu trả lời chỉ liên kết không cung cấp nội dung của riêng nó. –

0

Không không có sự khác biệt giữa hai người này, bởi vì trong quá trình xử lý logic của truy vấn, WHERE sẽ luôn luôn đi ngay sau khi khoản lọc (ON), trong ví dụ của bạn, bạn sẽ có:

  1. sản phẩm Descartes (số hàng từ TableA x số hàng từ TableB)
  2. Lọc (ON)
  3. đâu.

ví dụ của bạn là trong tiêu chuẩn ANSI SQL-92, bạn cũng có thể viết các truy vấn với tiêu chuẩn ANSI SQL-89 như thế này:

SELECT blah FROM TableA a,TableB b 
WHERE b.id = a.id AND b.deleted = 0 AND a.field = 5 

Điều này đúng cho bên tham gia, VỚI outer joins IS SIMILAR NHƯNG KHÔNG CÙNG MỘT SỐ

0

Với tham gia bên trong, bạn sẽ có kết quả tương tự và có thể có cùng hiệu suất. Tuy nhiên, với việc kết nối bên ngoài hai truy vấn sẽ trả về các kết quả khác nhau và không tương đương chút nào khi đặt điều kiện trong mệnh đề where sẽ thay đổi truy vấn từ một phép nối trái sang một phép nối bên trong (trừ khi bạn đang tìm kiếm các bản ghi trường là null).