2012-04-12 23 views
19

Nếu tôi cómệnh đề WHERE TRƯỚC INNER JOIN

SELECT * FROM Table1 t1 
LEFT JOIN Table2 t1 ON t1.id = t2.id 
WHERE t1.user='bob'; 

Liệu chạy WHERE khoản sau hai bảng là JOINED?

Tôi làm cách nào để nó chạy trước khi JOIN?

+0

Các câu trả lời được đưa ra là chính xác, nhưng nó đáng để tìm hiểu sâu hơn một chút. Tại sao bạn tìm kiếm hành vi này? Tôi tưởng tượng trình tối ưu hóa truy vấn sẽ xử lý trường hợp hiển nhiên cho bạn ... –

Trả lời

19

Thay đổi WHERE khác JOIN trạng

LEFT JOIN Table2 t2 on t1.id = t2.id AND t1.user='bob'

0

bạn có thể làm

SELECT * 
    FROM Table1 t1 
    LEFT JOIN Table2 t2 
     ON t1.id=t2.id AND t1.user='bob'; 
55

Mệnh where sẽ được thực hiện trước khi join để nó không tham gia ghi không cần thiết. Vì vậy, mã của bạn là tốt theo cách của nó.

+4

có ai khác có thể xác nhận không? – user1124535

+3

@ user1124535 Tôi có thể xác nhận. Chạy truy vấn 'giải thích' và bạn sẽ thấy. –

+2

Điều này sẽ nhận được nhiều hơn upvotes –

0

Trong kinh nghiệm của tôi trong một phép nối trái, bạn không thể loại trừ các bản ghi trong bảng 'trái' (t1) trong câu lệnh ON từ - theo định nghĩa - tất cả các bản ghi t1 sẽ được bao gồm. Câu lệnh where hoạt động vì nó sẽ được áp dụng cho kết quả của phép nối sau đó.

Tôi không biết chính xác những gì bạn muốn đạt được nhưng hầu hết có thể tham gia bên trong phù hợp với nhu cầu của bạn và sau đó bạn có thể thêm điều kiện t1.user = 'bob' vào tuyên bố ON.

Nhưng nếu Mosty Mostacho là chính xác, vị trí (WHERE vs ON) của điều kiện không liên quan đến tốc độ thực thi.

0

RIGHT JOIN là giải pháp:

SELECT cars.manufacturer, cars.year FROM cars 
RIGHT JOIN (SELECT m.manufacturer FROM cars AS m ORDER BY m.year DESC LIMIT 3) subq 
ON cars.manufacturer=subq.manufacturer 

Chưa đặt nó thông qua đầy đủ các điều kiện khắc nghiệt, nhưng dường như làm việc.