sql >> Database teknologi >  >> RDS >> Oracle

Forvirring med Oracle CONNECT BY

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.



  1. Forbedrer Foreign Key forespørgselsydeevne?

  2. Hvordan sender jeg værdi til en lagret procedureparameter i OLE DB-kildekomponent?

  3. TIME() Eksempler – MySQL

  4. Sådan udføres rå SQL i SQLAlchemy