Beispiele für Unterabfrageabfragen

Die folgenden Beispiele veranschaulichen die Susbelect-Abfrage.

  • Beispiel 1 – Wählen Sie alle Spalten und Zeilen aus der Tabelle "EMPLOYEE" aus.
      SELECT * FROM EMPLOYEE
  • Beispiel 2 – Fügen Sie die Tabellen EMP_ACT und EMPLOYEE zusammen, wählen Sie alle Spalten aus der Tabelle EMP_ACT aus und fügen Sie den Nachnamen des Mitarbeiters (LASTNAME) aus der Tabelle EMPLOYEE zu jeder Zeile des Ergebnisses hinzu.
       SELECT EMP_ACT.*, LASTNAME
         FROM EMP_ACT, EMPLOYEE
         WHERE EMP_ACT.EMPNO = EMPLOYEE.EMPNO
  • Beispiel 3 – Fügen Sie die Tabellen "EMPLOYEE" und "DEPARTMENT" zusammen und wählen Sie die Mitarbeiternummer (EMPNO), den Nachnamen des Mitarbeiters (LASTNAME), die Abteilungsnummer (WORKDEPT in der Tabelle "EMPLOYEE" und DEPTNO in der Tabelle "DEPARTMENT") und den Abteilungsnamen (DEPTNAME) aller Mitarbeiter aus, die vor 1955 geboren wurden (BIRTHDATE).
      SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME 
         FROM EMPLOYEE, DEPARTMENT                     
         WHERE WORKDEPT = DEPTNO     
         AND YEAR(BIRTHDATE) < 1955
  • Beispiel 4 – Wählen Sie die Stelle (JOB) und die Mindest- und Höchstgehälter (SALARY) für jede Gruppe von Zeilen mit demselben Stellenkode in der Tabelle EMPLOYEE aus, aber nur für Gruppen mit mehr als einer Zeile und mit einem Höchstgehalt von mindestens 27000.
       SELECT JOB, MIN(SALARY), MAX(SALARY)
         FROM EMPLOYEE
         GROUP BY JOB
         HAVING COUNT(*) > 1 
         AND MAX(SALARY) >= 27000
  • Beispiel 5 – Wählen Sie alle Zeilen der Tabelle EMP_ACT für Mitarbeiter (EMPNO) in der Abteilung (WORKDEPT) E11 " aus. (Die Mitarbeiterabteilungsnummern werden in der Tabelle EMPLOYEE angezeigt.)
      SELECT *
        FROM EMP_ACT  
        WHERE EMPNO IN
                 (SELECT EMPNO 
                     FROM EMPLOYEE  
                     WHERE WORKDEPT = 'E11')
  • Beispiel 6 – Wählen Sie aus der Tabelle "EMPLOYEE" die Abteilungsnummer (WORKDEPT) und das maximale Abteilungsgehalt (SALARY) für alle Abteilungen aus, deren maximales Gehalt unter dem Durchschnittsgehalt aller Mitarbeiter liegt.
      SELECT WORKDEPT, MAX(SALARY) 
        FROM EMPLOYEE 
        GROUP BY WORKDEPT  
        HAVING MAX(SALARY) < (SELECT AVG(SALARY)
                                  FROM EMPLOYEE)
    Die Unterabfrage in der HAVING-Klausel wird in diesem Beispiel einmal ausgeführt.
  • Beispiel 7 – Wählen Sie in der Tabelle "EMPLOYEE" die Abteilungsnummer (WORKDEPT) und das maximale Abteilungsgehalt (SALARY) für alle Abteilungen aus, deren maximales Gehalt unter dem Durchschnittsgehalt aller anderen Abteilungen liegt.
      SELECT WORKDEPT, MAX(SALARY)
         FROM EMPLOYEE EMP_COR
          GROUP BY WORKDEPT 
          HAVING MAX(SALARY) < (SELECT AVG(SALARY)
                                  FROM EMPLOYEE
                                  WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)

    Im Gegensatz zu Beispiel 6 wird die Unterabfrage in der HAVING-Klausel für jede Gruppe ausgeführt.

  • Beispiel 8 – Ermitteln Sie die Anzahl der Mitarbeiter und das Gehalt der Vertriebsmitarbeiter sowie das Durchschnittsgehalt und die Mitarbeiterzahl ihrer Abteilungen.
    Diese Abfrage muss zuerst einen verschachtelten Tabellenausdruck (DINFO) erstellen, um die Spalten AVGSALARY und EMPCOUNT sowie die Spalte DEPTNO abzurufen, die in der WHERE-Klausel verwendet wird.
     SELECT THIS_EMP.EMPNO, THIS_EMP.SALARY, DINFO.AVGSALARY, DINFO.EMPCOUNT
      FROM EMPLOYEE THIS_EMP,
            (SELECT OTHERS.WORKDEPT AS DEPTNO,
                               AVG(OTHERS.SALARY) AS AVGSALARY,
                               COUNT(*) AS EMPCOUNT
              FROM EMPLOYEE OTHERS
              GROUP BY OTHERS.WORKDEPT
             ) AS DINFO
      WHERE THIS_EMP.JOB = 'SALESREP'
       AND THIS_EMP.WORKDEPT = DINFO.DEPTNO

    Durch die Verwendung eines verschachtelten Tabellenausdrucks für diesen Fall werden die Verarbeitungsressourcen zum Erstellen der Sicht DINFO als reguläre Sicht gespeichert. Bei der Vorbereitung von Aussagen wird der Zugriff auf den Katalog für die Ansicht vermieden. Aufgrund des Kontexts der restlichen Abfrage werden in der Ansicht nur die Zeilen für die Abteilung der Vertriebsmitarbeiter berücksichtigt.

  • Beispiel 9 – Geben Sie das durchschnittliche Bildungsniveau und das Durchschnittsgehalt für fünf zufällige Gruppen von Mitarbeitern an.
    Diese Abfrage erfordert die Verwendung eines verschachtelten Tabellenausdrucks, um einen Zufallswert für jeden Mitarbeiter festzulegen, damit dieser später in der GROUP BY-Klausel verwendet werden kann.
      SELECT RANDID , AVG(EDLEVEL), AVG(SALARY)
        FROM ( SELECT EDLEVEL, SALARY, INTEGER(RAND()*5) AS RANDID
                 FROM EMPLOYEE
             ) AS EMPRAND
        GROUP BY RANDID
  • Beispiel 10 – Abfrage der Tabelle EMP_ACT und Rückgabe der Projektnummern, bei denen ein Mitarbeiter zu den 10 bestbezahlten Mitarbeitern gehört.
      SELECT EMP_ACT.EMPNO,PROJNO
         FROM EMP_ACT
         WHERE EMP_ACT.EMPNO IN
             (SELECT EMPLOYEE.EMPNO
              FROM EMPLOYEE
              ORDER BY SALARY DESC
              FETCH FIRST 10 ROWS ONLY)
  • Beispiel 11 – Angenommen, PHONES und IDS sind zwei SQL-Variablen mit Array-Werten derselben Kardinalität. Wandeln Sie diese Arrays in eine Tabelle mit drei Spalten (eine für jedes Array und eine für die Position) und einer Zeile pro Array-Element um.
       SELECT T.PHONE, T.ID, T.INDEX FROM UNNEST(PHONES, IDS)
         WITH ORDINALITY AS T(PHONE, ID, INDEX)
         ORDER BY T.INDEX