Обяснението в отговора на Крокодилко е просто грешно. Може да пренебрегнете знака „Правилен отговор“ и многобройните гласове „за“, пак е грешно. Интересно е, че той остави като упражнение точно случая, който доказва грешността на обяснението.
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