Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Clausola CONNECT BY
La clausola CONNECT BY specifica la relazione tra le righe in una gerarchia. È possibile utilizzare CONNECT BY per selezionare le righe in ordine gerarchico eseguendo il joining della tabella con se stessa ed elaborando i dati gerarchici. Ad esempio, può essere usata per eseguire spostamenti in modo ricorsivo all'interno di un organigramma ed elencare i dati.
L'elaborazione delle query gerarchiche avviene nel seguente ordine:
Se la clausola FROM ha un join, viene elaborata per prima.
Viene valutata la clausola CONNECT BY.
Viene valutata la clausola WHERE.
Sintassi
[START WITH start_with_conditions] CONNECT BY connect_by_conditions
Nota
Sebbene START e CONNECT non siano parole riservate, utilizza identificatori delimitati (virgolette doppie) o AS se si utilizza START e CONNECT come alias di tabella nella query per evitare errori in fase di 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'
Parametri
- start_with_conditions
-
Condizioni che specificano la riga o le righe principali della gerarchia
- connect_by_conditions
-
Condizioni che specificano la relazione tra le righe principali e le righe secondarie della gerarchia. Almeno una condizione deve essere qualificata con l'operatore unario
PRIOR column = expression -- or expression > PRIOR column
Operatori
È possibile utilizzare i seguenti operatori in una query CONNECT BY.
- LEVEL
-
Pseudocolonna che restituisce il livello di riga corrente nella gerarchia. Restituisce 1 per la riga principale, 2 per la riga secondaria e così via.
- PRIOR
-
Operatore unario che valuta l'espressione per la riga principale della riga corrente nella gerarchia.
Esempi
L'esempio seguente è una query CONNECT BY che restituisce il numero di dipendenti che riportano direttamente o indirettamente a John (non più di 4 livelli).
SELECT id, name, manager_id FROM employee WHERE LEVEL < 4 START WITH name = 'John' CONNECT BY PRIOR id = manager_id;
Di seguito è riportato il risultato della query.
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
La definizione di tabella per questo esempio è la seguente:
CREATE TABLE employee ( id INT, name VARCHAR(20), manager_id INT );
Di seguito sono riportate le righe inserite nella tabella.
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);
Di seguito è riportato un organigramma per il dipartimento di John.
