从单个查询的多个 Select 语句中获取结果

Get result from Multiple Select statement on a single Query

我正在尝试创建一个存储过程来显示由经理管理的用户的结果。我尝试过使用 CTE 但仍然没有成功。

我想要的,

  1. 第一个查询 select 其 user name = @name
  2. 的行
  3. 第二个查询:return 个由(第一个查询 ManagerId
  4. 管理的用户
  5. 第三个查询:return每个(第二个查询ManagerId)管理的所有用户

这是数据的结构:

SQL查询:

WITH EmployeeCTE AS 
(
    (SELECT UserId, Email, ManagerId, Name 
     FROM Table1
     WHERE DisplayName LIKE '%Paul%') tbl1
    (SELECT UserId, Email, ManagerId, Name
     FROM Table1
     WHERE ManagerId = tbl1.UserId) tbl2
    (SELECT UserId, Email, ManagerId, Name
     FROM Table1
     WHERE ManagerId = tbl1.UserId) tbl3
 
)
--Lastly 
SELECT * 
FROM EmployeeCTE

请帮助任何人。

你只需要一个合适的递归 CTE——像这样:

WITH EmployeeCTE AS 
(
    -- "anchor" for the query 
    SELECT 
        UserId, Email, ManagerId, Name,
        [Level] = 1
    FROM   
        dbo.Table1
    WHERE 
        Name LIKE '%Paul%'
        -- I would personally probably use this condition instead
        -- ManagerId IS NULL

    UNION ALL
    
    -- recursive part
    SELECT 
        t1.UserId, t1.Email, t1.ManagerId, t1.Name,
        e.[Level] + 1
    FROM   
        dbo.Table1 t1
    INNER JOIN
        EmployeeCTE e ON t1.ManagerId = e.UserId
)
SELECT * 
FROM EmployeeCTE

这会选择“锚”行(或多行),然后根据Employee.ManagerId = Manager.UserId“递归”manager/employee 关系。我还添加了 Level 列,这样您就可以看到每个条目位于(层次结构的)哪个级别 - “锚点”将是级别 1,每个进一步的级别递增 1.

PS:如果需要限制返回的数据集为根级+max。 2 级以下,您可以使用 Level 列在从 CTE 选择的最终 SELECT 中执行此操作:

WITH EmployeeCTE AS 
(
   --- as above
)
SELECT * 
FROM EmployeeCTE
WHERE [Level] <= 3   -- select root level (1) and max. of 2 levels down