我有一个典型的Persons表和一个Orders表定义,我可以按以下方式执行JOIN查询以返回所有人的订单。
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.id=Orders.Person_id
问题是,如何撰写一份声明,以便返回所有没有订单的人?
我正在使用mysql。
提前全部感谢。
答案 0 :(得分:23)
您可能希望使用LEFT JOIN
和IS NULL
:
SELECT Persons.LastName, Persons.FirstName
FROM Persons
LEFT JOIN Orders ON Persons.id = Orders.Person_id
WHERE Orders.Person_id IS NULL;
左连接的结果始终包含“左”表(人员)的所有记录,即使连接条件未在“右”表(订单)中找到任何匹配记录。如果没有匹配项,则“右”表的列将在结果集中NULL
。
答案 1 :(得分:10)
这应该有效......不止一种方法。
select * from persons where person.id not in (select person_id from orders)
答案 2 :(得分:3)
为了完整起见,这里是not exists
版本:
select * from persons p
where not exists
(select null from orders o where o.person_id = p.id)
答案 3 :(得分:0)
您可以使用左连接:
SELECT DISTINCT o.CustomerID from Orders as o
left join Customers as c
on o.CustomerID=c.CustomerID