2010-10-04 6 views
9

J'ai une table Persons typique et une table Orders définie de telle sorte que je peux faire une requête JOIN comme suit pour retourner des commandes pour toutes les personnes. La question est, comment puis-je écrire une déclaration qui retournerait toutes les personnes sans ordres?Instruction SQL pour obtenir tous les clients sans commandes

J'utilise mysql.

Merci d'avance.

Répondre

17

Vous pouvez utiliser LEFT JOIN et IS NULL:

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

Le résultat d'une jointure gauche contient toujours tous les enregistrements de la table « gauche » (personnes), même si la condition_jointure ne trouve pas enregistrement correspondant dans la "bonne" table (Commandes). Lorsqu'il n'y a pas de correspondance, les colonnes de la table "droite" vont NULL dans le jeu de résultats.

8

Cela devrait fonctionner ... il y a plus d'une façon de le faire.

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

Cela fonctionne bien, mais peut devenir très inefficace pour les grands ensembles de disques qu'il obtient d'abord toutes les commandes, il filtre qu'avec la requête externe. La réponse jointe est vraiment la meilleure façon de s'y prendre. –

3

Juste pour être complet, voici la version not exists:

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

Les trois réponses fonctionnent exactement comme je le souhaitais. Merci à tous. – timeon

Questions connexes