Förklaringen i Krokodilkos svar är helt enkelt felaktig. Du kan bortse från markeringen "Rätt svar" och de många uppröstningarna, det är fortfarande fel. Det är intressant att han lämnade som en övning just det fallet som bevisar att förklaringen är felaktig.
En CONNECT BY
frågan fungerar inte "som om" nya tabeller (eller nya utdataraduppsättningar av SELECT
i alla fall) genereras vid varje steg. Detta är felet i argumentationen.
Snarare finns det bara en raduppsättning genererad totalt (över alla steg). Det är sant att nya rader läggs till baserat på de rader som genererades i föregående steg; men själva raduppsättningen är en, och växande, inte separata raduppsättningar.
Detta är särskilt relevant med avseende på ROWNUM
. ROWNUM
tilldelas rader i en enda "resultat"-raduppsättning, som börjar med 1. I en CONNECT BY
fråga, det finns bara en raduppsättning och ROWNUM
går från 1 till n i ökande följd.
Om Krokodilkos svar var korrekt, då ROWNUM
skulle starta om vid 1 vid varje steg. Så är uppenbarligen inte fallet:låt oss prova det på en "standard" hierarkisk fråga.
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