Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Kebingungan dengan Oracle CONNECT BY

Bagaimana CONNECT BY kueri dieksekusi dan dievaluasi - langkah demi langkah (dengan contoh).

Katakanlah kita memiliki tabel berikut dan terhubung dengan kueri:

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;

Langkah 1:

Pilih baris dari tabel mytable yang memenuhi START WITH kondisi, tetapkan LEVEL =1 ke set hasil yang dikembalikan:

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

 SELECT * FROM step1;

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

Langkah 2

Tingkatkan level sebesar 1:

LEVEL = LEVEL + 1

Bergabunglah dengan kumpulan hasil yang dikembalikan pada langkah sebelumnya dengan mytable menggunakan CONNECT BY kondisi sebagai kondisi bergabung.

Dalam klausa ini PRIOR column-name mengacu pada hasil yang dikembalikan oleh langkah sebelumnya, dan sederhana column-name mengacu pada 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

LANGKAH x+1

Ulangi #2 hingga operasi terakhir mengembalikan kumpulan hasil yang kosong.

Langkah 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

Langkah 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 

Langkah 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

Langkah 5 tidak mengembalikan baris, jadi sekarang kami menyelesaikan kueri

Langkah terakhir

UNION ALL hasil dari semua langkah dan kembalikan sebagai hasil akhir:

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 

Sekarang mari kita terapkan prosedur di atas pada kueri Anda:

SELECT * FROM dual;

DUMMY
-----
X 

SELECT LEVEL FROM DUAL CONNECT BY rownum>5;

Langkah 1

Karena kueri tidak mengandung START WITH klausa, Oracle memilih semua catatan dari tabel sumber:

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

select * from step1;

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

Langkah 2

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

select * from step2;

no rows selected

Karena langkah terakhir tidak mengembalikan baris, kami akan menyelesaikan kueri kami.

Langkah terakhir

SELECT * FROM step1
UNION ALL

SELECT * FROM step2;

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

Analisis kueri terakhir:

select level from dual connect by rownum<10;

Saya serahkan kepada Anda sebagai tugas rumah.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah Oracle mendukung pencarian teks lengkap?

  2. Manajer Konkuren Oracle

  3. Oracle:'=ANY()' vs. 'IN ()'

  4. Membuat Mesin Virtual Dengan Oracle VM Virtual Box

  5. Di mana Database Bug Oracle?