2010-10-04 30 views
9

Tôi có bảng Persons điển hình và bảng Đơn hàng được định nghĩa theo cách mà tôi có thể thực hiện JOIN truy vấn như sau để trả lại Đơn hàng cho tất cả Người.Câu lệnh SQL để có được tất cả khách hàng không có đơn đặt hàng

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo 
FROM Persons 
INNER JOIN Orders 
ON Persons.id=Orders.Person_id 

Câu hỏi là, làm cách nào để viết một tuyên bố trả về tất cả những người KHÔNG có đơn đặt hàng?

Tôi đang sử dụng mysql.

Cảm ơn tất cả trước.

Trả lời

17

Bạn có thể muốn sử dụng LEFT JOINIS NULL:

SELECT  Persons.LastName, Persons.FirstName 
FROM  Persons 
LEFT JOIN Orders ON Persons.id = Orders.Person_id 
WHERE  Orders.Person_id IS NULL; 

Kết quả của một trái tham gia luôn chứa tất cả hồ sơ của bảng "left" (Người), ngay cả khi tham gia điều kiện không tìm thấy bất kỳ bản ghi khớp trong bảng "bên phải" (Đơn hàng). Khi không có kết quả phù hợp, các cột của bảng "bên phải" sẽ là NULL trong tập hợp kết quả.

8

Điều này sẽ hoạt động ... có nhiều cách để thực hiện.

select * from persons where person.id not in (select person_id from orders) 
+0

này sẽ làm việc thực sự, nhưng có thể trở nên rất hiệu quả cho bộ hồ sơ lớn như nó lần đầu tiên được tất cả các đơn đặt hàng, sau đó nó lọc rằng với truy vấn bên ngoài. Các câu trả lời tham gia thực sự là cách tốt nhất để đi về nó. –

3

Chỉ cần cho đầy đủ, đây là phiên bản not exists:

select * from persons p 
where not exists 
(select null from orders o where o.person_id = p.id) 
+0

Cả ba câu trả lời đều hoạt động đúng như tôi mong muốn. Cảm ơn tất cả các bạn. – timeon

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