Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Verwechslung mit Oracle CONNECT BY

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.