Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle, conectar por rownum


A explicação na resposta de Krokodilko está simplesmente errada. Você pode desconsiderar a marca "Resposta correta" e os numerosos votos positivos, ainda está errado. É interessante que ele tenha deixado como exercício exatamente o caso que prova que a explicação está errada.

Um CONNECT BY consulta não funciona "como se" novas tabelas (ou novos conjuntos de linhas de saída de SELECT instruções, de qualquer maneira) são geradas em cada etapa. Este é o erro do argumento.

Em vez disso, há apenas um conjunto de linhas gerado em geral (em todas as etapas). É verdade que novas linhas são adicionadas com base nas linhas geradas na etapa anterior; mas o conjunto de linhas em si é um e crescendo, não conjuntos de linhas separados.

Isso é particularmente relevante em relação a ROWNUM . ROWNUM é atribuído a linhas em um único conjunto de linhas "resultado", começando com 1. Em um CONNECT BY consulta, há apenas um conjunto de linhas e ROWNUM vai de 1 a n em uma seqüência crescente.

Se a resposta de Krokodilko estiver correta, então ROWNUM reiniciaria em 1 em cada etapa. Este claramente não é o caso:vamos tentar em uma consulta hierárquica "padrão".
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