Cláusula CONNECT BY - Amazon Redshift

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:

  1. Si la cláusula FROM tiene una combinación, se procesa primero.

  2. Se evalúa la cláusula CONNECT BY.

  3. 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 unario que se usa para hacer referencia a la fila principal.

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.

Un diagrama del organigrama del departamento de John.