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

Angenommen, Sie möchten eine Liste mit den Mitarbeiternummern, Namen und Provisionen aller Mitarbeiter, die an einem bestimmten Projekt arbeiten, dessen Projektnummer MA2111 lautet. Der erste Teil der SELECT-Anweisung ist einfach zu schreiben:
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.

Sie können eine Unterabfrage verwenden, um dieses Problem zu lösen. Eine Unterabfrage ist eine Unterauswahl oder eine Vollauswahl in einer WHERE-Klausel. Die SELECT-Anweisung, die die Unterabfrage umgibt, wird als äußere SELECT-Anweisung bezeichnet.
SELECT EMPNO, LASTNAME, COMM
  FROM DSN8C10.EMP
  WHERE EMPNO IN
    (SELECT EMPNO
       FROM DSN8C10.EMPPROJACT
        WHERE PROJNO = 'MA2111');
Um die Ergebnisse dieser SQL-Anweisung besser zu verstehen, stellen Sie sich vor, dass Db2 den folgenden Prozess durchläuft:
  1. Db2 wertet die Unterabfrage aus, um eine Liste von EMPNO-Werten zu erhalten:
    (SELECT EMPNO
       FROM DSN8C10.EMPPROJACT
       WHERE PROJNO = 'MA2111');
    Das Ergebnis ist in einer Zwischenergebnistabelle aufgeführt, die der folgenden Ausgabe ähnelt:
    from EMPNO 
         =====
         200
         200
         220 
  2. 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.

Eine Unterabfrage wird nur einmal ausgeführt, wenn die Unterabfrage für jede Zeile oder Gruppe gleich ist. Diese Art von Unterabfrage ist unkorreliert, d. h. sie wird nur einmal ausgeführt. Beispielsweise ist in der folgenden Anweisung der Inhalt der Unterabfrage für jede Zeile der Tabelle DSN8C10.EMP derselbe :
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

Ein Prädikat ist ein Element einer Suchbedingung, das eine Bedingung angibt, die für eine bestimmte Zeile oder Gruppe wahr, falsch oder unbekannt ist. Eine Unterabfrage, d. h. eine SELECT-Anweisung innerhalb der WHERE- oder HAVING-Klausel einer anderen SQL-Anweisung, ist immer Teil eines Prädikats. Das Prädikat hat die Form:
operand operator (subquery)
Eine WHERE- oder HAVING-Klausel kann Prädikate enthalten, die Unterabfragen enthalten. Ein Prädikat, das eine Unterabfrage enthält, kann wie jedes andere Suchprädikat in Klammern gesetzt werden, dem Schlüsselwort NOT vorangestellt werden und über die Schlüsselwörter AND und OR mit anderen Prädikaten verknüpft werden. Zum Beispiel kann die WHERE-Klausel einer Abfrage wie folgt aussehen:
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

Eine Unterabfrage muss eine Ergebnistabelle mit derselben Anzahl an Spalten wie die Anzahl der Spalten auf der linken Seite des Vergleichsoperators erzeugen. Zum Beispiel sind die folgenden beiden SELECT-Anweisungen zulässig:
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 ".