Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle, Connect By rownum

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