De uitleg in Krokodilko's antwoord is gewoon fout. Je mag het teken "Correct Answer" en de talrijke upvotes negeren, het is nog steeds verkeerd. Het is interessant dat hij als oefening precies het geval heeft gelaten dat bewijst dat de uitleg niet klopt.
EEN CONNECT BY
query werkt niet "alsof" nieuwe tabellen (of nieuwe uitvoerrijensets van SELECT
verklaringen, hoe dan ook) worden bij elke stap gegenereerd. Dit is de fout in het argument.
In plaats daarvan is er maar één rijenset gegenereerd in het algemeen (over alle stappen). Het is waar dat nieuwe rijen worden toegevoegd op basis van de rijen die in de vorige stap zijn gegenereerd; maar de rijenset zelf is één, en groeiende, geen afzonderlijke rijenset.
Dit is met name relevant met betrekking tot ROWNUM
. ROWNUM
wordt toegewezen aan rijen in een enkele "resultaat" rijenset, beginnend met 1. In een CONNECT BY
query, er is slechts één rijenset en ROWNUM
gaat van 1 naar n in oplopende volgorde.
Als het antwoord van Krokodilko juist was, dan ROWNUM
zou herstarten bij 1 bij elke stap. Dit is duidelijk niet het geval:laten we het eens proberen op een "standaard" hiërarchische zoekopdracht.
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