capypad
0 Tage Serie
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
sql
1
2
3
4
5
6
7
8
9
10
11
12
SELECT s.name
FROM students s
WHERE NOT EXISTS (
SELECT c.id
FROM courses c
WHERE NOT EXISTS (
SELECT 1
FROM enrollment e
WHERE e.student_id = s.id
AND 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.