2010-05-21 1 views
2

Je dois générer une liste d'utilisateurs qui sont des gestionnaires, ou des gestionnaires de gestionnaires, pour les départements de l'entreprise.CTE pour construire une liste de départements et de gestionnaires (hiérarchique)

J'ai deux tables; on détaille les départements et l'un contient la hiérarchie de gestion (simplifié):

CREATE TABLE [dbo].[Manager](
[ManagerId] [int], 
[ParentManagerId] [int]) 

CREATE TABLE [dbo].[Department](
[DepartmentId] [int], 
[ManagerId] [int]) 

Fondamentalement, je suis en train de construire un CTE qui me donnera une liste de DepartmentIds, ainsi que tous les ManagerIds qui sont dans la hiérarchie du gestionnaire pour ce département.

Alors ... Dis Manager 1 est le gestionnaire pour le département 1, et Manager 2 est le gestionnaire de Manager 1 et Manager 3 est le gestionnaire de Manager 2, je voudrais voir:

DepartmentId, ManagerId 
1, 1 
1, 2 
1, 3 

Fondamentalement, les gestionnaires sont en mesure de traiter avec tous les départements de leur sous-gestionnaire.

La construction du CTE pour retourner la hiérarchie Manager est assez simple, mais je me bats pour injecter les départements là-bas:

WITH DepartmentManagers 
AS 
(
    SELECT  ManagerId, 
       ParentManagerId, 
       0 AS Depth 
    From  Manager 

    UNION ALL 

    SELECT  Manager.ManagerId, 
       Manager.ParentManagerId, 
       DepartmentManagers.Depth + 1 AS Depth 
    FROM  Manager 
    INNER JOIN DepartmentManagers 
       ON DepartmentManagers.ManagerId = Manager.ParentManagerId 
) 

je besoin d'une liste de tous les ministères ainsi que tous les gestionnaires connexes.

Quelqu'un peut-il aider?

Répondre

1

Changer votre requête d'ancrage:

WITH DepartmentManagers 
     AS 
     (
     SELECT d.DepartmentID, 
       d.ManagerId, 
       m.ParentManagerId 
       0 AS Depth 
     FROM Department d 
     JOIN Manager m 
     ON  m.ManagerID = d.managerID 
     WHERE DepartmentID = 1 
     UNION ALL 
     SELECT d.DepartementID, 
       m.ManagerId, 
       m.ParentManagerId, 
       d.Depth + 1 
     FROM DepartmentManagers d 
     JOIN Manager m 
     ON  m.ManagerId = d.ParentManagerID 
     ) 
+0

Désolé - j'étais un peu clair sur exactement ce que je dois les résultats contiennent. Je veux énumérer tous les départements avec tous leurs directeurs - ceci formera la base d'une vue. Merci –

+0

@Milky: voir la mise à jour post. – Quassnoi

+0

Ah. Cela ne semble pas fonctionner lorsqu'un gestionnaire est un gestionnaire de plus d'un département. Je découvre que les données auxquelles je suis confronté sont plutôt mauvaises: un manager peut aussi être leur propre manager! J'ai mis à jour mon message pour refléter cela. –

Questions connexes