On dirait que vous voulez utiliser un CTE récursif. Le books online article parle de votre type de scénario. Voici un ensemble d'échantillons de code que je viens d'utiliser dans un article stackoverflow différent ...
CREATE TABLE dbo.ctetest (employeeid int primary key not null, managerid int null);
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 1, NULL;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 2, 1;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 3, 1;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 4, 2;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 5, 2;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 6, 3;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 7, 2;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 8, 5;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 9, 4;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 10, 6;
INSERT INTO dbo.ctetest (employeeid, managerid) SELECT 11, 6;
WITH recursivecte (employeeid, managerid, level)
AS
(SELECT employeeid
, managerid
, 'level' = 0
FROM dbo.ctetest
WHERE managerid IS NULL
UNION ALL
SELECT ct.employeeid
, ct.managerid
, 'level' = rc.level + 1
FROM dbo.ctetest ct
JOIN recursivecte rc
ON ct.managerid = rc.employeeid)
SELECT *
FROM recursivecte rc
Cela devrait vous donner la hiérarchie de chaque employé d'un niveau à. Si vous souhaitez renvoyer des informations sur le niveau supérieur suivant, par exemple un nom de gestionnaire, il vous suffit d'ajouter rc.managername à la deuxième partie de UNION ALL, ajouter des colonnes à la table CTE (c'est le WITH recursivecte (employeeid, managerid , niveau) section, et donner des place-titulaires dans la première partie de la déclaration
Merci Nice et simple Apprécié - Love the hair -btw. – user17510