Forklaringen i Krokodilkos svar er simpelthen forkert. Du kan se bort fra "Korrekt svar"-mærket og de mange opstemmer, det er stadig forkert. Det er interessant, at han forlod som en øvelse netop den sag, der beviser, at forklaringen er forkert.
En CONNECT BY
forespørgsel virker ikke "som om" nye tabeller (eller nye output rækkesæt af SELECT
i hvert fald) genereres ved hvert trin. Dette er fejlen i argumentationen.
Der er snarere kun én rækkesæt genereret samlet (på tværs af alle trin). Det er rigtigt, at nye rækker tilføjes baseret på de rækker, der blev genereret i det foregående trin; men selve rækkesættet er ét, og voksende, ikke separate rækkesæt.
Dette er især relevant med hensyn til ROWNUM
. ROWNUM
er tildelt rækker i et enkelt "resultat" rækkesæt, startende med 1. I en CONNECT BY
forespørgsel, er der kun ét rækkesæt og ROWNUM
går fra 1 til n i stigende rækkefølge.
Hvis Krokodilkos svar var korrekt, så ROWNUM
ville genstarte ved 1 ved hvert trin. Dette er tydeligvis ikke tilfældet:lad os prøve det på en "standard" hierarkisk forespørgsel.
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