sql >> Base de Datos >  >> RDS >> Oracle

Oracle, conectar por número de fila

La explicación en la respuesta de Krokodilko es simplemente incorrecta. Puede ignorar la marca de "Respuesta correcta" y los numerosos votos a favor, todavía está mal. Es interesante que dejó como ejercicio exactamente el caso que prueba que la explicación es incorrecta.

A CONNECT BY la consulta no funciona "como si" nuevas tablas (o nuevos conjuntos de filas de salida de SELECT declaraciones, de todos modos) se generan en cada paso. Este es el error en el argumento.

Más bien, solo hay uno conjunto de filas generado en general (en todos los pasos). Es cierto que se agregan filas nuevas en base a las filas generadas en el paso anterior; pero el conjunto de filas en sí mismo es uno, y crece, no conjuntos de filas separados.

Esto es particularmente relevante con respecto a ROWNUM . ROWNUM se asigna a filas en un solo conjunto de filas de "resultado", comenzando con 1. En un CONNECT BY consulta, solo hay un conjunto de filas y ROWNUM va de 1 a n en secuencia creciente.

Si la respuesta de Krokodilko fuera correcta, entonces ROWNUM reiniciaría en 1 en cada paso. Claramente, este no es el caso:intentémoslo en una consulta jerárquica "estándar".

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