Oracle, Connect By rownum - PullRequest
       78

Oracle, Connect By rownum

0 голосов
/ 20 октября 2018

Я попытался найти информацию о подключении по «движку».Я нашел этот пост: Путаница с Oracle CONNECT BY

Пользователь krokodilko ответил и сказал:

The analyze of the last query:

select level from dual connect by rownum<10;
I leave to you as a homework assignment.

Поэтому я попытался сделать именно так, как описано для запроса

Select rownum from dual connect by rownum < 3

А вот моя «работа»:

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

create table step2 as
SELECT 2 "LEVEL" from dual
JOIN step1 "PRIOR" on rownum <=3;
SELECT * FROM step2;
create table step3 as
select 3 "LEVEL" from dual
join step2 "PRIOR" on rownum <=3;
SELECT * FROM step3;
create table step4 as
select 4 "LEVEL" from dual
join step3 "PRIOR" on rownum <=3;
SELECT * FROM step4;

Но последний SELECT по-прежнему возвращает строки.Я что-то не так понял?Каждый раз, когда я выбираю УРОВЕНЬ + 1 «УРОВЕНЬ», он имеет значение rownum = 1, так что это всегда так.Так я провалил шаги?

1 Ответ

0 голосов
/ 20 октября 2018

Объяснение в ответе Крокодилко просто неверно.Вы можете не обращать внимания на отметку «Правильный ответ» и многочисленные возражения, это все равно неправильно.Интересно, что он оставил в качестве упражнения именно тот случай, который доказывает, что объяснение неверно.

A CONNECT BY запрос не работает "как если бы" новые таблицы (или новые выходные наборы строк операторов SELECT)во всяком случае) генерируются на каждом этапе.Это ошибка в аргументе.

Скорее всего, генерируется всего один набор строк (по всем шагам).Это правда, что новые строки добавляются на основе строк, созданных на предыдущем шаге;но набор строк сам по себе один, и он растет, а не отдельные наборы строк.

Это особенно актуально в отношении ROWNUM.ROWNUM присваивается строкам в одном наборе строк «результата», начиная с 1. В запросе CONNECT BY имеется только один набор строк, а ROWNUM изменяется от 1 до n в возрастающей последовательности.

Если бы ответ Крокодилко был верным, то ROWNUM перезапускался бы на 1 на каждом шаге.Это явно не так: давайте попробуем это на «стандартном» иерархическом запросе.

select     empno, ename, mgr, level, rownum
from       scott.emp
start with mgr is null
connect by prior empno = mgr
;

     EMPNO ENAME             MGR      LEVEL     ROWNUM
---------- ---------- ---------- ---------- ----------
      7839 KING                           1          1
      7566 JONES            7839          2          2
      7788 SCOTT            7566          3          3
      7876 ADAMS            7788          4          4
      7902 FORD             7566          3          5
      7369 SMITH            7902          4          6
      7698 BLAKE            7839          2          7
      7499 ALLEN            7698          3          8
      7521 WARD             7698          3          9
      7654 MARTIN           7698          3         10
      7844 TURNER           7698          3         11
      7900 JAMES            7698          3         12
      7782 CLARK            7839          2         13
      7934 MILLER           7782          3         14
...