I have a typical Persons table and an Orders table defined in such a way that I can do JOIN query as the following to return Orders for all Persons.
SELECT Perso
You may want to use LEFT JOIN
and IS NULL
:
SELECT Persons.LastName, Persons.FirstName
FROM Persons
LEFT JOIN Orders ON Persons.id = Orders.Person_id
WHERE Orders.Person_id IS NULL;
The result of a left join always contains all records of the "left" table (Persons), even if the join-condition does not find any matching record in the "right" table (Orders). When there is no match, the columns of the "right" table will NULL
in the result set.
Just for completeness, here is the not exists
version:
select * from persons p
where not exists
(select null from orders o where o.person_id = p.id)
This should work... theres more than one way to do it.
select * from persons where person.id not in (select person_id from orders)