sql / expert
Snippet
Relationale Division durch doppelte Negation
Dieses Muster implementiert die universelle Quantifizierung (den 'FOR ALL'-Operator) mittels relationaler Algebra. Es identifiziert Entitäten (Studenten), die mit jedem Eintrag in einer Zielmenge (Kurse) verknüpft sind, indem sichergestellt wird, dass es keinen Kurs gibt, für den der Student nicht eingeschrieben ist. Dies ist robuster als COUNT-basierte Vergleiche, da es Mengenbeziehungen rein logisch verarbeitet.
snippet.sql
1
2
3
4
5
6
7
8
9
10
11
12
SELECT s.nameFROM students sWHERE NOT EXISTS (SELECT c.idFROM courses cWHERE NOT EXISTS (SELECT 1FROM enrollment eWHERE e.student_id = s.idAND e.course_id = c.id));
Erklärung
1
SELECT s.name FROM students s
Wählt die Kandidatendatensätze aus der primären Entitätstabelle aus.
2
WHERE NOT EXISTS (SELECT c.id FROM courses c ...)
Filtert nach Entitäten, für die kein Datensatz in der Anforderungsmenge existiert...
3
WHERE NOT EXISTS (SELECT 1 FROM enrollment e ...)
...für den kein passender Beziehungsdatensatz in der Verknüpfungstabelle vorhanden ist.