sql >> Databasteknik >  >> RDS >> Oracle

Oracle, Connect By rownum

Förklaringen i Krokodilkos svar är helt enkelt felaktig. Du kan bortse från markeringen "Rätt svar" och de många uppröstningarna, det är fortfarande fel. Det är intressant att han lämnade som en övning just det fallet som bevisar att förklaringen är felaktig.

En CONNECT BY frågan fungerar inte "som om" nya tabeller (eller nya utdataraduppsättningar av SELECT i alla fall) genereras vid varje steg. Detta är felet i argumentationen.

Snarare finns det bara en raduppsättning genererad totalt (över alla steg). Det är sant att nya rader läggs till baserat på de rader som genererades i föregående steg; men själva raduppsättningen är en, och växande, inte separata raduppsättningar.

Detta är särskilt relevant med avseende på ROWNUM . ROWNUM tilldelas rader i en enda "resultat"-raduppsättning, som börjar med 1. I en CONNECT BY fråga, det finns bara en raduppsättning och ROWNUM går från 1 till n i ökande följd.

Om Krokodilkos svar var korrekt, då ROWNUM skulle starta om vid 1 vid varje steg. Så är uppenbarligen inte fallet:låt oss prova det på en "standard" hierarkisk fråga.

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. Skriv ett tal med två decimaler SQL Server

  2. MySQL FLOOR()-funktion – avrunda nedåt till närmaste heltal

  3. Fråga med flera värden i en kolumn

  4. PSQLE Undantag och låsproblem när trigger läggs till i tabellen