Oracle SQL Tutorial: Mengenoperationen

Erläuterungen zu Oracle Mengenoperationen (union, intersect, minus)

Mengenoperationen dienen dazu, die Ergebnismengen zweier Abfragen zu einer zusammenzufassen. Die Mengen können vereinigt (UNION / UNION ALL), geschnitten (INTERSECT) oder von einander subtrahiert (MINUS) werden. Damit diese Operatoren angewendet werden können, müssen die selektierten Spalten in gleicher Anzahl und vom gleichen Typ ein. Die Zuordnung erfolgt über die Spaltenreihenfolge.

Es ist nahezu beliebig möglich diese Operatoren zu verketten oder zu verschachteln.

Operator UNION / UNION ALL 

Die Ergebnismenge einer UNION-Operation enthält alle Zeilen aus beiden Abfragen. Bei „UNION ALL“ werden vollständig identische Zeilen nicht entfernt.

Beispiel: Saisonale Verteilung der Aufträge:  

select to_char(datum,’Q‘) Quartal, sum(anzahl*preis) Umsatz
from auftrag a, auftrag_pos p
where a.auftrag_nr= p.auftrag_nr
group by to_char(datum,’Q‘)

UNION

select ‚1‘ Quartal, 0 Umsatz
from dual
where not exists
(select auftrag_nr from auftrag where to_char(datum, ‚Q‘)=’1′)

UNION

select ‚2‘ Quartal, 0 Umsatz
from dual
where not exists
(select auftrag_nr from auftrag where to_char(datum, ‚Q‘)=’2′

UNION

select ‚3‘ Quartal, 0 Umsatz
from dual
where not exists
(select auftrag_nr from auftrag where to_char(datum, ‚Q‘)=’3′

UNION

select ‚4‘ Quartal, 0 Umsatz
from dual
where not exists
(select auftrag_nr from auftrag where to_char(datum, ‚Q‘)=’4′:

Weil die Hauptabfrage evtl. nicht alle möglichen Quartale liefert, werden über den „UNION“-Operator die fehlenden Quartale mit Umsatz 0 hinzugefügt. Damit diese Quartale nicht doppelt vorkommen, muss jeweils geprüft werden, ob das Quartal nicht schon in der Hauptabfrage existiert.

Operator INTERSECT 

Die Ergebnismenge enthält die Schnittmenge der Teilmengen, d.h. die Datensätze müssen in beiden Abfragen enthalten sein. Oft ist dieser Operator auch durch „EXISTS“ oder „IN“ realisierbar.

Beispiel: Artikel, die sowohl eingekauft als auch verkauft wurden:

select distinct artikel_nr
from bestell_pos p

INTERSECT

select distinct artikel_nr
from auftrag_pos;

Operator MINUS 

Die Ergebnismenge enthält die Differenz der Teilmengen, d.h. die Datensätze müssen in der ersten, dürfen aber nicht in der zweiten Abfragen enthalten sein. Oft ist dieser Operator auch durch „NOT EXISTS“ oder „NOT IN“ realisierbar

Beispiel: Artikel, die zwar eingekauft, nicht aber verkauft wurden:  

select distinct artikel_nr
from bestell_pos p

MINUS

select distinct artikel_nr
from auftrag_pos;