【问题标题】:SQL Server hierarchical find all managers for manager and insertSQL Server分层查找管理器的所有管理器并插入
【发布时间】:2021-09-07 12:59:44
【问题描述】:

我有一个包含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 行。

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

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 行。

我做错了什么?有没有更好的方法来做这个查询/插入?

【问题讨论】:

  • 请展示一些示例数据和预期结果
  • 我怀疑在原始查询中,您有多个具有相同管理员的用户。由于您在 ManagerEID 上执行 DISTINCT(),因此您正在删除那些重复项。如果您删除 distinct,您可以看到整个列表……您需要将 where 语句清理为更独特的内容
  • 是的,我正在查找特定经理下的所有员工,然后执行不同的操作以获得不同的经理。关于如何实施您的建议的任何想法?
  • DISTINCT 不是函数,它基本上意味着GROUP BY 每列

标签: sql sql-server sql-server-2008 sql-server-2012


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在您的原始查询中,您只有 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
    

    【讨论】:

      猜你喜欢
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多