Hallo Peter Thomassen,
SELECT number, COUNT(contract.
id\_contact-signatory
) as anz FROMcontact
LEFT JOIN contract ON (contact.id = contract.id\_contact-signatory
)
GROUP BY number HAVING anz = 0
Meiner Meinung nach besser:
SELECT DISTINCT number
FROM contact
LEFT JOIN contract
ON contact.id = contract.id\_contact-signatory
WHERE contract.id\_contact-signatory
IS NULL
SELECT number FROM contact
WHERE id NOT IN(SELECTid\_contact-signatory
FROM contract)
nicht mit NOT IN, sondern <> ANY
SELECT number
FROM contact
WHERE id <> ANY (SELECT id\_contact-signatory
FROM contract)
http://dev.mysql.com/doc/mysql/en/ANY_IN_SOME_subqueries.html
NOT EXISTS dürfte auch eine Möglichkeit sein.
Die erste funktioniert und liefert mir alle Kundennummern, für die kein Vertrag existiert. Die zweite wollte nach meinem Dafürhalten äquivalent zur ersten sein - und liefert mir ein leeres Resultset.
Du kannst auf die COUNT-Funktion und die GROUP-BY-Klausel verzichten :-)
Ich hab nicht viel Erfahrung mit Subqueries, also meldet euch bitte auch, wenn ihr der Meinung seid, dass es so eigentlich gehen müsste, damit ich wenigstens da auf der sicheren Seite bin. Danke!
In sehr vielen Fällen sind Subqueries ineffizient. Dieses ist ein schönes Beispiel dafür.
Freundliche Grüsse,
Vinzenz