nested table - der SELECT im SELECT
Eine nested table expression bietet dem Anwender die Möglichkeit, in der FROM-Klausel eines SELECT-Statements nicht eine View oder Tabelle anzugeben, sondern ein weiteres SELECTStatement. Dieses erzeugt dann eine temporäre Tabelle, welche die Basis des Haupt-SELECTs bildet. Der nested table Select kann bis auf wenige Ausnahmen den vollen Funktionsumfang des normalen Select-Statements nutzen, darunter auch Subqueries, Joins und weitere nested tables. Nicht erlaubt sind dagegen ein UNION, UNION ALL sowie diverse Klauseln wie z.B. ORDER BY (Wohl gemerkt, diese Einschränkungen gelten nur für den nested table select , nicht für das komplette Statement ). Der nested table Select muss in Klammern gesetzt werden und von einem Korrelationsnamen gefolgt sein.
Beispiel:
SELECT spalte, spalte ...
FROM
( SELECT spalte , spalte
FROM tabelle
WHERE bedingung ) AS correlation-name
WHERE bedingung
ORDER BY spalte;
Mit Hilfe dieser nested table lassen sich einige Probleme lösen, die früher den Einsatz von Views oder komplizierte Select-Konstrukte erforderten. So kann damit beispielsweise ein GROUP BY nach einem Teil einer Spalte realisiert werden. Ein GROUP BY SUBSTR(spalte,1,3) funktioniert ja bekanntlich nicht, jedoch ein nested table löst dieses Problem:
SELECT teilspalte , SUM (sp1) , AVG ( sp2 )
FROM
( SELECT SUBSTR ( spalte , 1 , 3 ) AS teilspalte , sp1 , sp2
FROM tabelle
WHERE bedingung ) AS corr
GROUP BY teilspalte ;
Bei diesem Beispiel wird durch den nested table select eine virtuelle Tabelle erstellt, die aus den Spalten teilspalte , sp1 und sp2 besteht und durch den Haupt-Select wie eine normale Tabelle angesprochen werden kann.
Eine weitere Anwendungsmöglichkeit für einen nested table:
Die Anzahl der unterschiedlichen Ausprägungen einer Spalte kann problemlos mittels eines
SELECT COUNT ( DISTINCT spalte ) FROM table
ermittelt werden. Die unterschiedlichen Ausprägungen einer Spaltenkombination zu ermitteln ist schwieriger, da ein
SELECT COUNT ( DISTINCT spalte1 , spalte2 ) FROM table
nicht möglich ist. Hier kann man sich aber mit einem nested table behelfen:
SELECT COUNT (*) FROM
( SELECT DISTINCT spalte1, spalte2 FROM table ) AS cor