Come un CONNECT BY
la query viene eseguita e valutata - passo dopo passo (nell'esempio).
Supponiamo di avere la seguente tabella e una connessione per query:
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;
Passaggio 1:
Seleziona le righe dalla tabella mytable
che soddisfano un START WITH
condizione, assegnare LEVEL =1 al set di risultati restituito:
CREATE TABLE step1 AS
SELECT 1 "LEVEL", X from mytable
WHERE x = 1;
SELECT * FROM step1;
LEVEL X
---------- ----------
1 1
Passaggio 2
Aumenta il livello di 1:
LEVEL = LEVEL + 1
Unisciti al set di risultati restituito nel passaggio precedente con mytable
utilizzando CONNECT BY
condizioni come condizioni di unione.
In questa clausola PRIOR column-name
fa riferimento al set di risultati restituito dal passaggio precedente e a un semplice column-name
si riferisce alla mytable
tabella:
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
PASSAGGIO x+1
Ripeti #2 finché l'ultima operazione non restituisce un set di risultati vuoto.
Passaggio 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
Passaggio 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
Passaggio 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
Il passaggio 5 non ha restituito righe, quindi ora finalizziamo la query
Ultimo passaggio
UNION ALL
risultati di tutti i passaggi e restituirlo come risultato finale:
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
Ora applichiamo la procedura sopra alla tua richiesta:
SELECT * FROM dual;
DUMMY
-----
X
SELECT LEVEL FROM DUAL CONNECT BY rownum>5;
Passaggio 1
Poiché la query non contiene il START WITH
clausola, Oracle seleziona tutti i record dalla tabella di origine:
CREATE TABLE step1 AS
SELECT 1 "LEVEL" FROM dual;
select * from step1;
LEVEL
----------
1
Passaggio 2
CREATE TABLE step2 AS
SELECT 2 "LEVEL" from dual
JOIN step1 "PRIOR"
ON rownum > 5
select * from step2;
no rows selected
Poiché l'ultimo passaggio non ha restituito righe, finalizzeremo la nostra query.
Ultimo passaggio
SELECT * FROM step1
UNION ALL
SELECT * FROM step2;
LEVEL
----------
1
L'analisi dell'ultima query:
select level from dual connect by rownum<10;
Vi lascio come compito a casa.