2013-03-18 39 views
27

Tôi có hai ví dụ sau.SQL JOIN nơi đặt điều kiện WHERE?

1. Ví dụ (WHERE)

SELECT 1 
    FROM table1 t1 
    JOIN table2 t2 ON t1.id = t2.id 
WHERE t2.field = true 

2. Ví dụ (THAM GIA VÀ)

SELECT 1 
    FROM table1 t1 
    JOIN table2 t2 ON t1.id = t2.id AND t2.field = true 

cách nhanh hơn về hiệu suất là bao nhiêu? Bạn thích cái nào hơn?

Trả lời

16

Nếu bộ lọc đi vào trong điều kiện JOIN có chức năng (tức là nó là điều kiện tham gia thực tế, không chỉ bộ lọc), nó phải xuất hiện trong mệnh đề ON của tham gia đó.

Worth chú ý:

  • Nếu bạn đặt nó trong mệnh đề WHERE thay vào đó, các buổi biểu diễn đều giống nhau nếu tham gia là INNER, nếu không nó khác. Như đã đề cập trong các ý kiến ​​nó không thực sự quan trọng vì dù sao kết quả cũng khác nhau.

  • Đặt bộ lọc trong mệnh đề WHERE khi nó thực sự là một điều kiện OUTER JOIN implicitely hủy OUTER bản chất của điều kiện ("tham gia ngay cả khi không có hồ sơ") như các bộ lọc này bao hàm hồ sơ thì phải có tồn tại trong những người đầu tiên địa điểm. Ví dụ:

... table1 t LEFT JOIN table2 u ON ... AND t2.column = 5 là đúng

... table1 t LEFT JOIN table2 u ON ... 
WHERE t2.column = 5 

là không chính xác, như t2.column = 5 kể động cơ rằng các bản ghi từ t2 đang mong đợi, mà đi ngược lại bên ngoài tham gia. Ngoại lệ này sẽ là một bộ lọc IS NULL, chẳng hạn như WHERE t2.column IS (NOT) NULL (mà thực chất là một cách thuận tiện để xây dựng bên ngoài có điều kiện tham gia)

  • LEFTRIGHT tham gia là implicitely OUTER tham gia.

Hy vọng điều đó sẽ hữu ích.

+2

Câu trả lời này chứa một số văn bản sai và lộn xộn. 1. Đối với INNER JOIN bất kỳ điều kiện nào có thể ở trong WHERE thay vì ON, miễn là không có RA THAM GIA can thiệp. 2. Khi di chuyển một điều kiện LEFT JOIN từ một ON đến một WHERE hiệu suất là không liên quan kể từ khi bạn nói, kết quả khác nhau. 3. Sự khác biệt đó không nói chung "chuyển đổi OUTER JOIN thành một INNER JOIN". – philipxy

+0

@philipxy bạn nói đúng, tôi đã cố gắng dọn dẹp một chút – Sebas

+0

Điều gì làm 'bộ lọc đi vào trong điều kiện JOIN có chức năng' hoặc '[bộ lọc] là điều kiện tham gia thực tế, không chỉ là bộ lọc' có nghĩa là gì? Dù sao khái niệm 'chỉ là một bộ lọc' không hữu ích vì ý nghĩa của 'JOIN ON c AND d' giống với' JOIN ON c WHERE d'. (Trong thực tế, tiêu chuẩn SQL * định nghĩa * JOIN ON trong điều khoản JOIN WHERE.) Tương tự "hủy bỏ triệt để bản chất OUTER của điều kiện" * không giao tiếp bất cứ điều gì *. Mà bạn dường như đồng ý với kể từ khi bạn chú thích nó với các scare-trích dẫn (do đó chính nó không rõ ràng) '("tham gia ngay cả khi không có hồ sơ")'. Bạn không giải thích. – philipxy

5

JOIN các điều kiện thường phải độc lập với điều kiện bộ lọc. Bạn xác định các quy tắc tham gia của mình (số cách) với ON. Bạn lọc những gì bạn muốn với WHERE. Hiệu suất khôn ngoan, không có quy tắc chung trên tất cả các công cụ và thiết kế, vì vậy số dặm của bạn sẽ khác nhau rất nhiều.

0

Tôi nghĩ cách nhanh hơn là đặt bộ lọc trong mệnh đề where, vì nó sẽ lọc bộ lọc đó ở vị trí đầu tiên, và sau đó là mệnh đề nối, do đó sẽ không cần hoán vị bộ lọc.

+0

Không có sự khác biệt cho một DBMS với bất kỳ tối ưu hóa ở tất cả. Ví dụ, xem tài liệu MySQL về tối ưu hóa SELECT/JOIN: BẬT của INNER JOIN được coi như là một WHERE được áp dụng cho JOIN đó. – philipxy

Các vấn đề liên quan