Hvordan en CONNECT BY
forespørgslen udføres og evalueres - trin for trin (ved eksempel).
Lad os sige, at vi har følgende tabel og en forbindelse ved forespørgsel:
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;
Trin 1:
Vælg rækker fra tabel mytable
der opfylder en START WITH
betingelse, tildel LEVEL =1 til det returnerede resultatsæt:
CREATE TABLE step1 AS
SELECT 1 "LEVEL", X from mytable
WHERE x = 1;
SELECT * FROM step1;
LEVEL X
---------- ----------
1 1
Trin 2
Forøg niveauet med 1:
LEVEL = LEVEL + 1
Deltag i resultatsættet, der blev returneret i forrige trin, med mytable
ved hjælp af CONNECT BY
betingelser som sammenføjningsbetingelser.
I denne klausul PRIOR column-name
refererer til det resultatsæt, der blev returneret af forrige trin, og simpelt column-name
henviser til mytable
tabel:
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
TRIN x+1
Gentag #2, indtil sidste handling returnerer et tomt resultatsæt.
Trin 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
Trin 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
Trin 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
Trin 5 returnerede ingen rækker, så nu afslutter vi forespørgslen
Sidste trin
UNION ALL
resultater af alle trin og returner det som det endelige resultat:
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
Lad os nu anvende ovenstående procedure på din forespørgsel:
SELECT * FROM dual;
DUMMY
-----
X
SELECT LEVEL FROM DUAL CONNECT BY rownum>5;
Trin 1
Da forespørgslen ikke indeholder START WITH
klausul, vælger Oracle alle poster fra kildetabellen:
CREATE TABLE step1 AS
SELECT 1 "LEVEL" FROM dual;
select * from step1;
LEVEL
----------
1
Trin 2
CREATE TABLE step2 AS
SELECT 2 "LEVEL" from dual
JOIN step1 "PRIOR"
ON rownum > 5
select * from step2;
no rows selected
Da det sidste trin ikke gav nogen rækker, vil vi afslutte vores forespørgsel.
Sidste trin
SELECT * FROM step1
UNION ALL
SELECT * FROM step2;
LEVEL
----------
1
Analysen af den sidste forespørgsel:
select level from dual connect by rownum<10;
Jeg overlader til dig som en hjemmeopgave.