Wie ein CONNECT BY
Abfrage wird ausgeführt und ausgewertet - Schritt für Schritt (per Beispiel).
Nehmen wir an, wir haben die folgende Tabelle und eine Connect-by-Abfrage:
select * from mytable;
X
----------
1
2
3
4
SELECT level, m.*
FROM mytable m
START with x = 1
CONNECT BY PRIOR x +1 = x OR PRIOR x + 2 = x
ORDER BY level;
Schritt 1:
Wählen Sie Zeilen aus der Tabelle mytable
aus die auf START WITH
treffen Bedingung, weisen Sie der zurückgegebenen Ergebnismenge LEVEL =1 zu:
CREATE TABLE step1 AS
SELECT 1 "LEVEL", X from mytable
WHERE x = 1;
SELECT * FROM step1;
LEVEL X
---------- ----------
1 1
Schritt 2
Stufe um 1 erhöhen:
LEVEL = LEVEL + 1
Verbinden Sie die im vorherigen Schritt zurückgegebene Ergebnismenge mit mytable
mit CONNECT BY
Bedingungen als Join-Bedingungen.
In dieser Klausel PRIOR column-name
bezieht sich auf die vom vorherigen Schritt zurückgegebene Ergebnismenge und einfach auf column-name
bezieht sich auf mytable
Tabelle:
CREATE TABLE step2 AS
SELECT 2 "LEVEL", mytable.X from mytable
JOIN step1 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step2;
LEVEL X
---------- ----------
2 2
2 3
SCHRITT x+1
Wiederholen Sie #2, bis die letzte Operation eine leere Ergebnismenge zurückgibt.
Schritt 3
CREATE TABLE step3 AS
SELECT 3 "LEVEL", mytable.X from mytable
JOIN step2 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step3;
LEVEL X
---------- ----------
3 3
3 4
3 4
Schritt 4
CREATE TABLE step4 AS
SELECT 4 "LEVEL", mytable.X from mytable
JOIN step3 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step4;
LEVEL X
---------- ----------
4 4
Schritt 5
CREATE TABLE step5 AS
SELECT 5 "LEVEL", mytable.X from mytable
JOIN step4 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step5;
no rows selected
Schritt 5 hat keine Zeilen zurückgegeben, also schließen wir jetzt die Abfrage ab
Letzter Schritt
UNION ALL
Ergebnisse aller Schritte und geben es als Endergebnis zurück:
SELECT * FROM step1
UNION ALL
SELECT * FROM step2
UNION ALL
SELECT * FROM step3
UNION ALL
SELECT * FROM step4
UNION ALL
SELECT * FROM step5;
LEVEL X
---------- ----------
1 1
2 2
2 3
3 3
3 4
3 4
4 4
Wenden wir nun das obige Verfahren auf Ihre Abfrage an:
SELECT * FROM dual;
DUMMY
-----
X
SELECT LEVEL FROM DUAL CONNECT BY rownum>5;
Schritt 1
Da die Abfrage den START WITH
nicht enthält -Klausel wählt Oracle alle Datensätze aus der Quelltabelle aus:
CREATE TABLE step1 AS
SELECT 1 "LEVEL" FROM dual;
select * from step1;
LEVEL
----------
1
Schritt 2
CREATE TABLE step2 AS
SELECT 2 "LEVEL" from dual
JOIN step1 "PRIOR"
ON rownum > 5
select * from step2;
no rows selected
Da der letzte Schritt keine Zeilen zurückgegeben hat, werden wir unsere Abfrage abschließen.
Letzter Schritt
SELECT * FROM step1
UNION ALL
SELECT * FROM step2;
LEVEL
----------
1
Die Analyse der letzten Abfrage:
select level from dual connect by rownum<10;
Ich überlasse es Ihnen als Hausaufgabe.