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