2010-10-04 99 views
9

我有一個典型的人員表和一個訂單表,這樣我可以做JOIN查詢,如下所示,爲所有人返回訂單。SQL語句讓所有客戶沒有訂單

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

的問題是,我怎麼寫,將返回所有的人有沒有訂單的聲明?

我正在使用mysql。

謝謝一切提前。

回答

17

您可能需要使用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; 

左連接總是包含了「左」表(人)的所有記錄的結果,即使加盟條件沒有找到任何匹配「右側」表中的記錄(訂單)。如果不匹配,結果集中「右」表的列將爲NULL

8

這應該工作... theres不止一種方式來做到這一點。

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

這的確會工作,但可以成爲大型記錄集效率非常低,因爲它首先獲得所有的訂單,那麼它過濾與外部查詢。加入答案實際上是最好的方式。 – 2018-01-31 15:55:20

3

只是爲了完整性,這裏是not exists版本:

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

所有三個答案正如我所願。感謝大家。 – timeon 2010-10-05 19:40:12

相關問題