Как се 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;
Оставям ви като домашна работа.