Vysvětlení v Krokodilkově odpovědi je prostě špatné. Můžete ignorovat značku "Správná odpověď" a četné kladné hlasy, stále je to špatně. Je zajímavé, že nechal jako cvičení přesně ten případ, který dokazuje, že vysvětlení je špatné.
A CONNECT BY
dotaz nefunguje "jako by" nové tabulky (nebo nové výstupní sady řádků SELECT
prohlášení) jsou generovány v každém kroku. Toto je chyba v argumentu.
Spíše existuje pouze jeden sada řádků vygenerována celkově (ve všech krocích). Je pravda, že nové řádky se přidávají na základě řádků vygenerovaných v předchozím kroku; ale samotná sada řádků je jedna a rozrůstá, nikoli samostatné sady řádků.
To je zvláště důležité s ohledem na ROWNUM
. ROWNUM
je přiřazeno k řádkům v jedné sadě řádků "výsledek", počínaje 1. V CONNECT BY
dotazu, existuje pouze jedna sada řádků a ROWNUM
přechází od 1 do n v rostoucí posloupnosti.
Pokud byla Krokodilkova odpověď správná, pak ROWNUM
restartuje na 1 v každém kroku. To zjevně není tento případ:zkusme to na „standardním“ hierarchickém dotazu.
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