Sql 从单个查询的多个Select语句中获取结果
我正在尝试创建一个存储过程,它将显示由管理员管理的用户的结果。我曾尝试使用CTE,但仍然没有成功 我想要什么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
user name=@name
ManagerId
)ManagerId
)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是完美的,使用关卡真的很有趣!现在我可以很好地利用它了。日味