Query korrekt? Alle Datensätze aus Tabelle X finden, die in Tabelle Y nicht vorkommen

Hallo,

ich habe mir für eine Fragestellung mit Hilfe von Google einen Query zusammengebaut und würde nur gerne von jemandem bestätigt haben, dass dieser tut, was ich denke, da er recht wichtig ist und ich mir 100% sicher sein will.

Zur Datenbank (Minimalbeispiel, nur relevantes für Query):
Ich habe eine Tabelle person mit den Feldern person_id und job_type sowie eine Tabelle contact, die Kontakte zwischen Paaren von Personen modelliert und daher zwei Felder person1 und person2 enthält, die beide Fremdschlüssel sind und auf person.person_id gemappt werden können.

Zum Query:
Mich interessiert Folgendes: Wie viele Personen mit job_typ=x gibt es, die keinerlei Kontakte zu anderen Personen haben?

Ich muss also, um das näher an SQL auszudrücken, die Anzahl von Personen aus der person-Tabelle wissen, die weder im Feld contact.person1 noch im Feld contact.person2 vorkommen.

Hier mein aktueller Query:

SELECT count(person_id) FROM person as a WHERE job_type=3 AND NOT EXISTS (SELECT * FROM contact as b WHERE b.person1 = a.person_id OR b.person2 = a.person_id);

Also nochmal meine Frage:
Erfüllt der Query die oben beschriebene Aufgabe?

Ich würde eher zu EXCEPT greifen (2 Abfragen auf contact, je auf die 2 Spalten, daraus UNION bilden, und diese Menge sowie die erstere Tabelle mit EXCEPT verbinden und guggen, was rausfällt)

Andreas

Ok, ich denke du meinst dann sowas hier:

SELECT person_id FROM person WHERE ( job_type = 3 ) EXCEPT ( SELECT person1 FROM contact UNION SELECT person2 FROM contact );

Dabei kommt die gleiche Anzahl von Zeilen raus wie bei meinem Query, also scheint das ja zu passen, super.

Allerdings kommt komischerweise bei dem neuen Query “0 rows” raus, wenn ich count() in ihm benutze, ihn also so verändere:

SELECT count(person_id) FROM person WHERE ( job_type = 3 ) EXCEPT ( SELECT person1 FROM contact UNION SELECT person2 FROM contact );

Das hängt wahrscheinlich mit der Ausführungsreihenfolge zusammen, ist mir aber auch eigentlich egal. Meine Frage ist beantwortet, vielen Dank!