2010-10-04 10 views
9

Ich habe eine typische Personentabelle und eine Tabelle, die so definiert ist, dass ich JOIN-Abfragen wie folgt ausführen kann, um Aufträge für alle Personen zurückzugeben.SQL-Anweisung, um alle Kunden ohne Aufträge zu erhalten

Die Frage ist, wie schreibe ich eine Aussage, die alle Personen ohne Aufträge zurückgeben würde?

Ich verwende mysql.

Vielen Dank im Voraus.

Antwort

17

Sie möchten LEFT JOIN und IS NULL verwenden:

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

Das Ergebnis eines LEFT JOIN immer alle Datensätze der „linken“ Tabelle enthält (Personen), auch wenn die Join-Bedingung nicht findet übereinstimmender Datensatz in der "richtigen" Tabelle (Bestellungen). Wenn keine Übereinstimmung vorliegt, werden die Spalten der "richtigen" Tabelle NULL in der Ergebnismenge angezeigt.

8

Dies sollte funktionieren ... Theres mehr als eine Möglichkeit, es zu tun.

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

Diese in der Tat funktioniert, kann aber für große Datensätzen sehr ineffizient, da sie zuerst alle Aufträge bekommt, dann filtert sie, dass mit die äußere Abfrage. Die beitreten Antwort ist wirklich der beste Weg, um darüber zu gehen. –

3

Nur der Vollständigkeit halber, hier ist die not exists Version:

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

Alle drei Antworten funktionieren genau so, wie ich es wollte. Danke an euch alle. – timeon

Verwandte Themen