SQL 服务器分层查找所有管理器并插入管理器

SQL Server hierarchical find all managers for manager and insert

我有一名员工 table,其中包括 EmployeeIdManagerId。我正在尝试进行分层查询并查找特定经理下的所有经理,即使他们不是直接下属。

到目前为止我创建了这个查询

WITH cte_org AS 
(
    SELECT       
        EmployeeId,
        FirstName,
        LastName,
        ManagerEID
    FROM       
        Users
    WHERE  
        ManagerEID = @ManagerEID

    UNION ALL

    SELECT 
        u.EmployeeId,
        u.FirstName,
        u.LastName,
        u.ManagerEID
    FROM 
        Users u
    INNER JOIN 
        cte_org o ON o.EmployeeId = u.ManagerEID
)
SELECT DISTINCT(ManagerEID)
FROM cte_org
WHERE ManagerEID != @ManagerEID; 

这个查询工作正常,在这个特定的场景中我选择了 13 行。

问题是我想将这些行插入到一个新的 table 中,该新 table 有一些我需要填充的其他列。所以我尝试这样做:

WITH cte_org AS 
(
    SELECT       
        EmployeeId,
        FirstName,
        LastName,
        ManagerEID
    FROM       
        Users
    WHERE 
        ManagerEID = @ManagerEID

    UNION ALL

    SELECT 
        u.EmployeeId,
        u.FirstName,
        u.LastName,
        u.ManagerEID
    FROM 
        Users u
    INNER JOIN 
        cte_org o ON o.EmployeeId = u.ManagerEID
)
INSERT INTO TeamRoles (ManagerEID, Id, TeamName, IsTopLevel, IsRecursive, TopLevelManagerEID, RoleId)
    SELECT DISTINCT(ManagerEID), NEWID(), 'Static VALUE', 0, 1, @ManagerEID, 4
    FROM cte_org
    WHERE ManagerEID != @MangerEID;

现在这个查询插入了 33 行。

我做错了什么?有更好的方法吗query/insert?

您可以再添加一个新的 CTE table,然后使用新的 CTE table 来处理插入。

WITH cte_org AS (
SELECT       
    EmployeeId,
    FirstName,
    LastName,
    ManagerEID
FROM       
    Users
WHERE ManagerEID = @ManagerEID
UNION ALL
SELECT 
    u.EmployeeId,
    u.FirstName,
    u.LastName,
    u.ManagerEID
FROM 
    Users u
    INNER JOIN cte_org o 
        ON o.EmployeeId = u.ManagerEID
),
cte_org_new
AS
(
    SELECT distinct(ManagerEID)
    from cte_org
    where ManagerEID != @ManagerEID;    
)

INSERT Into TeamRoles(ManagerEID, Id, TeamName, IsTopLevel, IsRecursive, TopLevelManagerEID, RoleId)
SELECT ManagerEID, NEWID(), 'Static VALUE', 0, 1, @ManagerEID, 4
FROM cte_org_new

在您的原始查询中,您只有 managerId 和您已删除的重复项。

在您后续的插入查询中,因为您使用的是 NEWID(),所以每一行都是唯一的。所以,您的 DISTINCT 没有过滤重复的 ManagerId。

我在下面使用简单的代码来解释您的情况。

declare @TABLE Table(ManagerId int)

insert into @Table
values (1),(1),(1)

SELECT DISTINCT(managerid), newid() as id from @table
managerid id
1 401845D6-BA6F-4BE2-9200-171A24BDCFB8
1 8A54A569-DC87-4FD9-A05A-55AAF40E4F35
1 46C789BD-E5F3-458A-9EFA-B5B63621F189

你要做的是,

 INSERT Into TeamRoles(ManagerEID, Id, TeamName, IsTopLevel, IsRecursive, TopLevelManagerEID, RoleId)

SELECT ManagerEID    , NEWID(), 'Static VALUE', 0, 1, @ManagerEID, 4
FROM
    (SELECT distinct(ManagerEID)
    FROM cte_org
    WHERE ManagerEID != @MangerEID) as t