Cómo CONNECT BY
la consulta se ejecuta y evalúa - paso a paso (por ejemplo).
Digamos que tenemos la siguiente tabla y una consulta de conexión:
select * from mytable;
X
----------
1
2
3
4
SELECT level, m.*
FROM mytable m
START with x = 1
CONNECT BY PRIOR x +1 = x OR PRIOR x + 2 = x
ORDER BY level;
Seleccionar filas de la tabla mytable
que cumplan con un START WITH
condición, asigne LEVEL =1 al conjunto de resultados devuelto:
CREATE TABLE step1 AS
SELECT 1 "LEVEL", X from mytable
WHERE x = 1;
SELECT * FROM step1;
LEVEL X
---------- ----------
1 1
Paso 2
Aumentar el nivel en 1:
LEVEL = LEVEL + 1
Únase al conjunto de resultados devuelto en el paso anterior con mytable
usando CONNECT BY
condiciones como las condiciones de unión.
En esta cláusula PRIOR column-name
se refiere al conjunto de resultados devuelto por el paso anterior, y simple column-name
se refiere a mytable
tabla:
CREATE TABLE step2 AS
SELECT 2 "LEVEL", mytable.X from mytable
JOIN step1 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step2;
LEVEL X
---------- ----------
2 2
2 3
PASO x+1
Repita el n.º 2 hasta que la última operación devuelva un conjunto de resultados vacío.
Paso 3
CREATE TABLE step3 AS
SELECT 3 "LEVEL", mytable.X from mytable
JOIN step2 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step3;
LEVEL X
---------- ----------
3 3
3 4
3 4
Paso 4
CREATE TABLE step4 AS
SELECT 4 "LEVEL", mytable.X from mytable
JOIN step3 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step4;
LEVEL X
---------- ----------
4 4
Paso 5
CREATE TABLE step5 AS
SELECT 5 "LEVEL", mytable.X from mytable
JOIN step4 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step5;
no rows selected
El paso 5 no devolvió filas, por lo que ahora finalizamos la consulta
Último paso
UNION ALL
resultados de todos los pasos y devolverlo como resultado final:
SELECT * FROM step1
UNION ALL
SELECT * FROM step2
UNION ALL
SELECT * FROM step3
UNION ALL
SELECT * FROM step4
UNION ALL
SELECT * FROM step5;
LEVEL X
---------- ----------
1 1
2 2
2 3
3 3
3 4
3 4
4 4
Ahora apliquemos el procedimiento anterior a su consulta:
SELECT * FROM dual;
DUMMY
-----
X
SELECT LEVEL FROM DUAL CONNECT BY rownum>5;
Dado que la consulta no contiene el START WITH
cláusula, Oracle selecciona todos los registros de la tabla de origen:
CREATE TABLE step1 AS
SELECT 1 "LEVEL" FROM dual;
select * from step1;
LEVEL
----------
1
Paso 2
CREATE TABLE step2 AS
SELECT 2 "LEVEL" from dual
JOIN step1 "PRIOR"
ON rownum > 5
select * from step2;
no rows selected
Dado que el último paso no devolvió filas, vamos a finalizar nuestra consulta.
Último paso
SELECT * FROM step1
UNION ALL
SELECT * FROM step2;
LEVEL
----------
1
El análisis de la última consulta:
select level from dual connect by rownum<10;
Te lo dejo como tarea para casa.