SQL, Dubletten – und etwas Mengenlehre

Mit SQL und einigen Joins lässt sich aus einer Datenbank schnell die Information gewinnen, welche Objekte eine gesuchte Eigenschaft haben. Sehr viel schwieriger zu beantworten kann dagegen die Frage sein, welches Objekt eine bestimmte Beziehung oder Eigenschaft nicht besitzt, vor allem dann, wenn Dubletten in 1:n-Relationen vorliegen.

Dazu ein vereinfachtes Beispiel: Drei Kinder, Anne und Benny und Charlotte, besitzen einiges an Spielzeug. Anne hat einen roten Ball, Benny einen blauen, und Charlotte sogar einen roten und blauen Ball. Nun soll per SQL die Frage beantwortet werden: Welches Kind hat keinen roten Ball?

Falsch – wenn auch naheliegend – wäre der folgende Ansatz in SQL über eine direkte where-Abfrage:

Select Name from Kinder where Ball.Farbe <> 'rot';

Denn das Ergebnis dieser Abfrage wären ja Benny und Charlotte, da Charlotte aber zwei Bälle besitzt, darunter ja auch einen roten, ist das Ergebnis falsch.

Um zum richtigen Ergebnis zu gelangen, muss man statt der direkten Prüfung auf die Objekt-Eigenschaft (die Farbe der Bälle der Kinder) einen Ansatz aus der Perspektive der Mengenlehre wählen, etwa: Gib mir zunächst die Namen aller Kinder, und entferne dann im zweiten Schritt aus dieser Menge all die Kinder, die einen roten Ball besitzen. Die hierbei übrig bleibenden Kinder sind genau diejenigen ohne roten Ball – und damit die richtige Antwort auf die gestellte Frage.

In SQL ausgedrückt hätte das gesuchte Statement also die folgende Struktur:

Select distinct Name from Kinder
MINUS
Select distinct Name from Kinder where Ball.Farbe = 'rot';

Oder auch:

Select distinct Name from Kinder
where Name not in
(Select distinct Name from Kinder where Ball.Farbe = 'rot');

Und, ja genau, wer jetzt an diese komischen Kreise aus dem Matheunterricht denkt, liegt genau richtig!

Mein Kommentar...