Ciao a tutti,
che ne dite di una CTE ricorsiva? Osservate il seguente esempio:
use tempdb;
GO
CREATE TABLE #Gerarchia
(
id int NOT NULL PRIMARY KEY CLUSTERED
, username varchar(30) NOT NULL
, idResponsabile int NULL
);
INSERT INTO #Gerarchia (id, username, idResponsabile)
VALUES
(1, 'Disney', NULL)
, (2, 'Topolino', 1)
, (3, 'Pippo', 1)
, (4, 'Zio Paperone', 1)
, (5, 'Paperino', 4)
, (6, 'Qui', 5)
, (7, 'Quo', 5)
, (8, 'Qua', 5)
, (9, 'Nonna Papera', 5)
, (10, 'Ciccio', 9);
SELECT
id
, username
, idResponsabile
FROM
#Gerarchia;
/*
id username idResponsabile
----------- ------------------------------ --------------
1 Disney NULL
2 Topolino 1
3 Pippo 1
4 Zio Paperone 1
5 Paperino 4
6 Qui 5
7 Quo 5
8 Qua 5
9 Nonna Papera 5
10 Ciccio 9
*/
DECLARE @id int = 4; -- ZIO PAPERINO
-- Creazione della CTE Ricorsiva
WITH CTEGerarchia (idResponsabile, idImpiegato, UserName, Livello)
AS
(
-- Testata (per far partire la ricorsione)
SELECT
G.idResponsabile
, G.id
, G.username
, Livello = 0
FROM
#Gerarchia G
WHERE
G.idResponsabile = @id
UNION ALL
-- Membro ricorsivo
SELECT
G.idResponsabile
, G.id
, G.username
, Livello + 1
FROM
#Gerarchia G
JOIN
CTEGerarchia C ON G.idResponsabile = C.idImpiegato
)
-- Lettura
SELECT
'| ' + CAST(REPLICATE('---', Livello) AS varchar(30)) + ' | ' + UserName
FROM
CTEGerarchia C;
/*
-----------------------------------------------------------------
| | Paperino
| --- | Qui
| --- | Quo
| --- | Qua
| --- | Nonna Papera
| ------ | Ciccio
*/
-- cleanup
DROP TABLE #Gerarchia;
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT
http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi