La spiegazione nella risposta di Krokodilko è semplicemente sbagliata. Potresti ignorare il segno "Risposta corretta" e i numerosi voti positivi, è ancora sbagliato. È interessante notare che ha lasciato come esercizio proprio il caso che dimostra che la spiegazione è sbagliata.
Un CONNECT BY
la query non funziona "come se" nuove tabelle (o nuovi set di righe di output di SELECT
istruzioni, comunque) vengono generati ad ogni passaggio. Questo è l'errore nell'argomento.
Piuttosto, ce n'è solo uno set di righe generato nel complesso (in tutti i passaggi). È vero che vengono aggiunte nuove righe in base alle righe generate nel passaggio precedente; ma il set di righe stesso è uno, e in crescita, non set di righe separati.
Ciò è particolarmente rilevante per quanto riguarda ROWNUM
. ROWNUM
viene assegnato alle righe in un unico set di righe "risultato", a partire da 1. In un CONNECT BY
query, esiste un solo set di righe e ROWNUM
va da 1 a n in sequenza crescente.
Se la risposta di Krokodilko era corretta, allora ROWNUM
ricomincerebbe da 1 ad ogni passaggio. Questo chiaramente non è il caso:proviamolo su una query gerarchica "standard".
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