Oracle SQL Tutorial: Subqueries

Verschachtelte SQL-Select-Abfragen mit Oracle

Um komplexere Abfragen zu erstellen, kann es notwendig sein, in der Bedingung Abfragen zu verschachteln.

Operator „in“ bzw. „not in“ 

Alle Artikel zu denen es keine Aufträge gibt:

select artikel_nr, bezeichnung
from artikel
where artikel_nr not in
(select artikel_nr from auftrag_pos);

Für jede Zeile in „ARTIKEL“ wird eine Zwischenmenge erzeugt, die alle Artikelnummern aus der Tabelle „AUFTRAG_POS“ enthält. Dann wird für jede Zeile geprüft, ob die Artikelnummer, in der Zwischenmenge enthalten ist.

Dieser Operator sollte aus Performancegründen möglichst vermieden werden.

Operator „exists“ bzw. „not exists“ 

Alle Artikel zu denen es keine Aufträge gibt:

select artikel_nr, bezeichnung
from artikel a
where not exists
(select artikel_nr from auftrag_pos ap
where ap.artikel_nr = a.artikel_nr);

Wiederum wird für jede Zeile eine Zwischenmenge erzeugt. Diese sind jedoch wesentlich kleiner.

Operator „=“ 

Alle Auftragsnummern mit dem höchsten Umsatz anzeigen:

select auftrag_nr
from auftrag_pos
where anzahl * preis =
(select max(sum(anzahl*preis))
from auftrag_pos
group by auftrag_nr);

Subqueries mit einer Zeile und einer Spalte 

Subqueries, die genau eine Zeile und eine Spalte liefern, können an allen Stellen eingesetzt werden, an denen auch andere Platzhalter (Spalten, Literale) verwendet werden können. Dabei sind Querverbindungen möglich:

Beispiele:  

select artikel_nr, bezeichnung,
(select sum(anzahl*preis)
from auftrag_pos p
where p.artikel_nr = a.artikel_nr) Umsatz
from artikel a;

select artikel_nr, bezeichnung
from artikel a
order by
select sum(anzahl*preis)
from auftrag_pos p
where p.artikel_nr = a.artikel_nr);

insert into kunde (
kunden_nr,
name1
) values (
(select nvl(max(kunden_nr),1) from kunde) + 1,
‚Meier AG‘);

oder

insert into kunde (kunden_nr,
name1
) values (
(select nvl(max(kunden_nr+1),1) from kunde) ,
‚Meier AG‘)