Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle, Connect By rownum

Die Erklärung in Krokodilkos Antwort ist einfach falsch. Sie können die Markierung "Richtige Antwort" und die zahlreichen Upvotes ignorieren, es ist immer noch falsch. Interessant ist, dass er genau den Fall als Übung weggelassen hat, der beweist, dass die Erklärung falsch ist.

A CONNECT BY Abfrage funktioniert nicht "als ob" neue Tabellen (oder neue Ausgabe-Rowsets von SELECT Anweisungen, sowieso) werden bei jedem Schritt generiert. Das ist der Fehler in der Argumentation.

Vielmehr gibt es nur eine Rowset insgesamt generiert (über alle Schritte). Es stimmt, dass neue Zeilen basierend auf den im vorherigen Schritt generierten Zeilen hinzugefügt werden; aber das Rowset selbst ist ein und wachsendes, kein separates Rowset.

Dies gilt insbesondere für ROWNUM . ROWNUM wird Zeilen in einem einzelnen "Ergebnis"-Rowset zugewiesen, beginnend mit 1. In einem CONNECT BY Abfrage gibt es nur ein Rowset und ROWNUM geht von 1 bis n in aufsteigender Reihenfolge.

Wenn Krokodilkos Antwort richtig war, dann ROWNUM würde bei jedem Schritt bei 1 neu starten. Dies ist eindeutig nicht der Fall:Versuchen wir es mit einer "normalen" hierarchischen Abfrage.

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