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

Oracle, Connect By rownum

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



  1. Sådan opsætter du asynkron replikering mellem MariaDB Galera-klynger

  2. Postgres-ordre efter udenlandsk nøgleydelse?

  3. Oracle 11g - hvordan man returnerer post fra funktion med tabel join

  4. Inkluder en kompleks logik i en enkelt MySQL-forespørgsel