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

Sql 从单个查询的多个Select语句中获取结果,sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,我正在尝试创建一个存储过程,它将显示由管理员管理的用户的结果。我曾尝试使用CTE,但仍然没有成功 我想要什么 选择其user name=@name 第二个查询:返回由管理的用户(第一个查询ManagerId) 第三个查询:返回每个用户管理的所有用户(第二个查询ManagerId) 这是数据的结构: SQL查询: WITH EmployeeCTE AS ( (SELECT UserId, Email, ManagerId, Name FROM Table1 WHE

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

我想要什么

  • 选择其
    user name=@name
  • 第二个查询:返回由管理的用户(第一个查询
    ManagerId
  • 第三个查询:返回每个用户管理的所有用户(第二个查询
    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
    来“递归”经理/员工关系。我还添加了
    Level
    列,这样您就可以看到每个条目位于哪个级别(层次结构的哪个级别)-“锚定”将是级别1,每向下一级增加1

    PS:如果您需要将返回的数据集限制为根级别+最多2个级别,您可以在从CTE中选择的最后一个
    SELECT
    中使用
    level
    列执行此操作:

    WITH EmployeeCTE AS 
    (
       --- as above
    )
    SELECT * 
    FROM EmployeeCTE
    WHERE [Level] <= 3   -- select root level (1) and max. of 2 levels down
    
    将EmployeeCTE作为
    (
    ---如上
    )
    选择*
    来自雇员
    
    在[Level]中,请阅读感谢Marc_,我已经测试并重新测试了。你的CTE是完美的,使用关卡真的很有趣!现在我可以很好地利用它了。日味