Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zamieszanie z Oracle CONNECT BY

Jak CONNECT BY zapytanie jest wykonywane i oceniane - krok po kroku (na przykładzie).

Załóżmy, że mamy poniższą tabelę i połączenie przez zapytanie:

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;

Krok 1:

Wybierz wiersze z tabeli mytable które spełniają START WITH warunek, przypisz POZIOM =1 do zwróconego zestawu wyników:

 CREATE TABLE step1 AS
 SELECT 1 "LEVEL", X from mytable
 WHERE x = 1;

 SELECT * FROM step1;

         LEVEL          X
    ---------- ----------
             1          1

Krok 2

Zwiększ poziom o 1:

LEVEL = LEVEL + 1

Dołącz do zestawu wyników zwróconego w poprzednim kroku za pomocą mytable za pomocą CONNECT BY warunki jako warunki przyłączenia.

W tej klauzuli PRIOR column-name odnosi się do zestawu wyników zwróconego w poprzednim kroku i prostej column-name odnosi się do mytable tabela:

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

KROK x+1

Powtarzaj #2, aż ostatnia operacja zwróci pusty zestaw wyników.

Krok 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

Krok 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 

Krok 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

Krok 5 nie zwrócił żadnych wierszy, więc teraz finalizujemy zapytanie

Ostatni krok

UNION ALL wyniki wszystkich kroków i zwróć je jako wynik końcowy:

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 

Teraz zastosujmy powyższą procedurę do zapytania:

SELECT * FROM dual;

DUMMY
-----
X 

SELECT LEVEL FROM DUAL CONNECT BY rownum>5;

Krok 1

Ponieważ zapytanie nie zawiera START WITH klauzula, Oracle wybiera wszystkie rekordy z tabeli źródłowej:

CREATE TABLE step1 AS
SELECT 1 "LEVEL" FROM dual;

select * from step1;

     LEVEL
----------
         1 

Krok 2

CREATE TABLE step2 AS
SELECT 2 "LEVEL" from dual
JOIN step1 "PRIOR"
ON rownum > 5

select * from step2;

no rows selected

Ponieważ ostatni krok nie zwrócił żadnych wierszy, sfinalizujemy nasze zapytanie.

Ostatni krok

SELECT * FROM step1
UNION ALL

SELECT * FROM step2;

     LEVEL
----------
         1

Analiza ostatniego zapytania:

select level from dual connect by rownum<10;

Zostawiam tobie jako zadanie domowe.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Odświeżanie / aktualizowanie ekranu formularza w Oracle D2k Forms 6i

  2. Kolumna tożsamości Oracle i wstaw do wyboru

  3. Dlaczego w SQL NULL nie może się równać z NULL?

  4. Opóźnienie Oracle między zatwierdzeniem a zaznaczeniem

  5. pobrać parametr z procedury składowanej?