Oracle
 sql >> база данни >  >> RDS >> Oracle

Объркване с Oracle CONNECT BY

Как се CONNECT BY заявката се изпълнява и оценява - стъпка по стъпка (чрез пример).

Да кажем, че имаме следната таблица и свързване чрез заявка:

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;

Стъпка 1:

Изберете редове от таблица mytable които отговарят на START WITH условие, присвоете LEVEL =1 на върнатия набор от резултати:

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

 SELECT * FROM step1;

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

Стъпка 2

Увеличете нивото с 1:

LEVEL = LEVEL + 1

Присъединете се към резултата, върнат в предишната стъпка с mytable като използвате CONNECT BY условия като условия за присъединяване.

В тази клауза PRIOR column-name се отнася до набора от резултати, върнат от предишната стъпка, и просто column-name се отнася до mytable таблица:

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

СТЪПКА x+1

Повторете #2, докато последната операция не върне празен набор от резултати.

Стъпка 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

Стъпка 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 

Стъпка 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

Стъпка 5 не върна редове, така че сега финализираме заявката

Последна стъпка

UNION ALL резултати от всички стъпки и го върне като краен резултат:

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 

Сега нека приложим горната процедура към вашата заявка:

SELECT * FROM dual;

DUMMY
-----
X 

SELECT LEVEL FROM DUAL CONNECT BY rownum>5;

Стъпка 1

Тъй като заявката не съдържа START WITH клауза, Oracle избира всички записи от таблицата източник:

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

select * from step1;

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

Стъпка 2

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

select * from step2;

no rows selected

Тъй като последната стъпка не върна редове, ще финализираме нашата заявка.

Последна стъпка

SELECT * FROM step1
UNION ALL

SELECT * FROM step2;

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

Анализът на последната заявка:

select level from dual connect by rownum<10;

Оставям ви като домашна работа.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORDER BY с вътрешна заявка, като ORA-00907 липсва дясна скоба

  2. Защо sqlplus не се свързва?

  3. Oracle Floats срещу число

  4. как да добавите секунда в времевата марка на Oracle

  5. Как да предам List от java на Oracle процедура?