Cláusula CONNECT BY
La cláusula CONNECT BY especifica la relación entre las filas de una jerarquía. Puede utilizar CONNECT BY para seleccionar filas en orden jerárquico mediante la combinación de la tabla consigo misma y el procesamiento los datos jerárquicos. Por ejemplo, puede utilizarla para recorrer recursivamente un organigrama y enumerar los datos.
Las consultas jerárquicas se procesan en el siguiente orden:
Si la cláusula FROM tiene una combinación, se procesa primero.
Se evalúa la cláusula CONNECT BY.
Se evalúa la cláusula WHERE.
Sintaxis
[START WITH start_with_conditions] CONNECT BY connect_by_conditions
nota
Aunque START y CONNECT no son palabras reservadas, utilice identificadores delimitados (comillas dobles) o AS si utiliza START y CONNECT como alias de tabla en su consulta para evitar errores en tiempo de ejecución.
SELECT COUNT(*) FROM Employee "start" CONNECT BY PRIOR id = manager_id START WITH name = 'John'
SELECT COUNT(*) FROM Employee AS start CONNECT BY PRIOR id = manager_id START WITH name = 'John'
Parámetros
- start_with_conditions
-
Condiciones que especifican las filas raíz de la jerarquía
- connect_by_conditions
-
Condiciones que especifican la relación entre las filas principales y las secundarias de la jerarquía. Se debe calificar al menos una condición con el operador
PRIOR column = expression -- or expression > PRIOR column
Operadores
Puede utilizar los siguientes operadores en una consulta CONNECT BY.
- LEVEL
-
Pseudocolumna que devuelve el nivel de fila actual en la jerarquía. Devuelve 1 para la fila raíz, 2 para el elemento secundario de la fila raíz, etc.
- PRIOR
-
Operador unario que evalúa la expresión correspondiente a la fila principal de la fila actual de la jerarquía.
Ejemplos
En el siguiente ejemplo se muestra una consulta CONNECT BY que devuelve la cantidad de empleados subordinados directos o indirectos de John, sin una profundidad superior a cuatro niveles.
SELECT id, name, manager_id FROM employee WHERE LEVEL < 4 START WITH name = 'John' CONNECT BY PRIOR id = manager_id;
A continuación, se muestra el resultado de la consulta.
id name manager_id ------+----------+-------------- 101 John 100 102 Jorge 101 103 Kwaku 101 110 Liu 101 201 Sofía 102 106 Mateo 102 110 Nikki 103 104 Paulo 103 105 Richard 103 120 Saanvi 104 200 Shirley 104 205 Zhang 104
Definición de la tabla para este ejemplo:
CREATE TABLE employee ( id INT, name VARCHAR(20), manager_id INT );
A continuación, se presentan las filas insertadas en la tabla.
INSERT INTO employee(id, name, manager_id) VALUES (100, 'Carlos', null), (101, 'John', 100), (102, 'Jorge', 101), (103, 'Kwaku', 101), (110, 'Liu', 101), (106, 'Mateo', 102), (110, 'Nikki', 103), (104, 'Paulo', 103), (105, 'Richard', 103), (120, 'Saanvi', 104), (200, 'Shirley', 104), (201, 'Sofía', 102), (205, 'Zhang', 104);
A continuación, se muestra un gráfico de la organización del departamento de John.