Cláusula CONNECT BY - Amazon Redshift

Cláusula CONNECT BY

A cláusula CONNECT BY especifica a relação entre as linhas em uma hierarquia. Você pode usar CONNECT BY para selecionar linhas em uma ordem hierárquica unindo a tabela a ela mesma e processando os dados hierárquicos. Por exemplo, você pode usá-la para percorrer recursivamente um organograma e listar dados.

As consultas hierárquicas são processadas na seguinte ordem:

  1. Se a cláusula FROM tiver uma união, ela será processada primeiro.

  2. A cláusula CONNECT BY é avaliada.

  3. A cláusula WHERE é avaliada.

Sintaxe

[START WITH start_with_conditions] CONNECT BY connect_by_conditions
nota

Embora START e CONNECT não sejam palavras reservadas, use identificadores delimitados (aspas duplas) ou AS se estiver usando START e CONNECT como aliases de tabela em sua consulta para evitar falhas no runtime.

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

Condições que especificam a(s) linha(s) raiz da hierarquia

connect_by_conditions

Condições que especificam a relação entre as linhas pais e as linhas filhas da hierarquia. Pelo menos uma condição deve ser qualificada com o operador unário usado para se referir à linha pai.

PRIOR column = expression -- or expression > PRIOR column

Operadores

É possível usar os seguintes operadores na consulta CONNECT BY.

LEVEL

Pseudocoluna que retorna o nível da linha atual na hierarquia. Retorna 1 para a linha raiz, 2 para a filha da linha raiz e assim por diante.

PRIOR

Operador unário que avalia a expressão da linha pai da linha atual na hierarquia.

Exemplos

O exemplo a seguir é uma consulta CONNECT BY que retorna o número de funcionários subordinados direta ou indiretamente a John, até o máximo de 4 níveis.

SELECT id, name, manager_id FROM employee WHERE LEVEL < 4 START WITH name = 'John' CONNECT BY PRIOR id = manager_id;

A seguir é o resultado da 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

Definição da tabela para esse exemplo:

CREATE TABLE employee ( id INT, name VARCHAR(20), manager_id INT );

A seguir estão as linhas inseridas na tabela.

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 seguir está um organograma para o departamento de John.

Um organograma do departamento de John.