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

zpgglvta  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(299)

我正在尝试创建一个存储过程,它将显示由管理器管理的用户的结果。我试过用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

请帮助任何人。

vsmadaxz

vsmadaxz1#

您只需要一个适当的递归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:如果需要将返回的数据集限制为根级别+最多两个级别,可以使用 Level 在你的期末考试中这样做 SELECT 从cte中选择:

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

相关问题