代码之家  ›  专栏  ›  技术社区  ›  asmgx

如何从表中选择子级的所有父级

  •  -1
  • asmgx  · 技术社区  · 3 年前

    EmpID   ManagerID   EmpName
    -----   ---------   -------
    1       NULL        Ali
    2       1           Mike
    3       1           Tom
    4       2           Kim
    5       2           Rob
    6       3           Lay
    7       5           Paul
    8       7           Sam
    9       6           Bin
    

    我正在尝试构建一个返回所有孩子的父母的查询

    Bin, Lay, Tom, Ali
    Sam, Paul, Rob, Mike, Ali
    

    我试过了,但没有成功

    SELECT * 
    FROM Employees A 
    LEFT OUTER JOIN Employees B ON A.ParentID  = B.EmpID 
    WHERE A.EmpID IN (8,9)
    

    1 回复  |  直到 3 年前
        1
  •  2
  •   Arun Palanisamy    3 年前

    使用 recursive cte

    WITH Parent AS
    (
        SELECT *
            FROM Employees WHERE EmpID IN (8,9)
        UNION ALL
        SELECT emp.*
            FROM Employees emp JOIN Parent ON emp.EmpID = Parent.ManagerID
    )
    SELECT distinct * FROM Parent
    
        2
  •  1
  •   Chiranjeevi Katta    3 年前

    解决方案是找到每个员工的最高层次结构,并使用字符串聚合对他们进行分组。我们可以按照层次结构中的级别顺序获得每个最高管理者下的所有员工姓名。

    WITH Parent AS
    (
        SELECT *,empid as top_hierarchy,0 as level
            FROM Employees  WHERE EmpID IN (8,9)
        UNION ALL
        SELECT emp.*, parent.top_hierarchy, level+1
            FROM Employees emp JOIN Parent ON emp.EmpID = Parent.ManagerID
    )
    SELECT STRING_AGG(EmpName,', ') within group(order by level) 
    FROM Parent group by top_hierarchy;
    

    http://sqlfiddle.com/#!18/8e17b2/1/0