Unterabfragen
Wenn Sie Ihre Suchbedingung basierend auf Informationen in einer Zwischentabelle eingrenzen müssen, können Sie eine Unterabfrage verwenden. Sie möchten beispielsweise alle Mitarbeiternummern in einer Tabelle finden, die auch für ein bestimmtes Projekt in einer zweiten Tabelle vorhanden sind.
Konzeptueller Überblick über Unterabfragen
SELECT EMPNO, LASTNAME, COMM
FROM DSN8C10.EMP
WHERE EMPNO
⋮Sie können jedoch nicht fortfahren, da die Tabelle DSN8C10.EMP keine Projektnummerndaten enthält. Sie wissen nicht, welche Mitarbeiter am Projekt MA2111 arbeiten , ohne eine weitere SELECT-Anweisung für die Tabelle DSN8C10.EMPPROJACT auszugeben.
SELECT EMPNO, LASTNAME, COMM
FROM DSN8C10.EMP
WHERE EMPNO IN
(SELECT EMPNO
FROM DSN8C10.EMPPROJACT
WHERE PROJNO = 'MA2111');- Db2 wertet die Unterabfrage aus, um eine Liste von EMPNO-Werten zu erhalten:
Das Ergebnis ist in einer Zwischenergebnistabelle aufgeführt, die der folgenden Ausgabe ähnelt:(SELECT EMPNO FROM DSN8C10.EMPPROJACT WHERE PROJNO = 'MA2111');from EMPNO ===== 200 200 220 - Die Tabelle mit den Zwischenergebnissen dient dann als Liste in der Suchbedingung des äußeren SELECT. Tatsächlich führt Db2 diese Aussage aus:
SELECT EMPNO, LASTNAME, COMM FROM DSN8C10.EMP WHERE EMPNO IN ('000200', '000220');Daher sieht die Ergebnistabelle ähnlich wie die folgende Ausgabe aus:EMPNO LASTNAME COMM ====== ======== ==== 000200 BROWN 2217 000220 LUTZ 2387
Korrelierte und nicht korrelierte Unterabfragen
Unterabfragen liefern Informationen, die benötigt werden, um eine Zeile (in einer WHERE-Klausel) oder eine Gruppe von Zeilen (in einer HAVING-Klausel) zu qualifizieren. Die Unterabfrage erzeugt eine Ergebnistabelle, die zur Qualifizierung der Zeile oder Gruppe ausgewählter Zeilen verwendet wird.
SELECT EMPNO, LASTNAME, COMM
FROM DSN8C10.EMP
WHERE EMPNO IN
(SELECT EMPNO
FROM DSN8C10.EMPPROJACT
WHERE PROJNO = 'MA2111');Unterabfragen, die sich inhaltlich von Zeile zu Zeile oder von Gruppe zu Gruppe unterscheiden, sind korrelierte Unterabfragen. Informationen zu korrelierten Unterabfragen finden Sie unter Korrelierte Unterabfragen.
Unterabfragen und Prädikate
operand operator (subquery)WHERE X IN (subquery1) AND (Y > SOME (subquery2) OR Z IS NULL)Unterabfragen können auch in den Prädikaten anderer Unterabfragen vorkommen. Solche Unterabfragen sind verschachtelte Unterabfragen auf einer bestimmten Verschachtelungsebene. Zum Beispiel hat eine Unterabfrage innerhalb einer Unterabfrage innerhalb einer äußeren SELECT-Abfrage eine Verschachtelungsebene von 2. Db2 erlaubt eine Verschachtelungstiefe von bis zu 15, aber nur wenige Abfragen erfordern eine Verschachtelungstiefe von mehr als 1.
Die Beziehung einer Unterabfrage zu ihrer äußeren SELECT-Abfrage ist dieselbe wie die Beziehung einer verschachtelten Unterabfrage zu einer Unterabfrage, und es gelten dieselben Regeln, sofern nicht anders angegeben.
Die Ergebnistabelle der Unterabfrage
SELECT EMPNO, LASTNAME
FROM DSN8C10.EMP
WHERE SALARY =
(SELECT AVG(SALARY)
FROM DSN8C10.EMP); SELECT EMPNO, LASTNAME
FROM DSN8C10.EMP
WHERE (SALARY, BONUS) IN
(SELECT AVG(SALARY), AVG(BONUS)
FROM DSN8C10.EMP);Mit Ausnahme einer Unterabfrage eines grundlegenden Prädikats kann die Ergebnistabelle mehr als eine Zeile enthalten. Weitere Informationen finden Sie unter "Orte, an denen Sie eine Unterabfrage einfügen können ".