sql >> Database >  >> RDS >> Oracle

Oracle, Connect By rownum

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



  1. Percona 5.6 InnoDB-probleem gebruikt indexen niet correct

  2. Hoe om te gaan met een enkele aanhalingsteken in Oracle SQL

  3. ORA-12170:TNS:Time-out verbinding opgetreden

  4. Opgeslagen procedure om serveropslaginformatie op server te krijgen