从单个查询的多个 Select 语句中获取结果
Get result from Multiple Select statement on a single Query
我正在尝试创建一个存储过程来显示由经理管理的用户的结果。我尝试过使用 CTE 但仍然没有成功。
我想要的,
- 第一个查询 select 其
user name = @name
的行
- 第二个查询:return 个由(第一个查询
ManagerId
) 管理的用户
- 第三个查询: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
我正在尝试创建一个存储过程来显示由经理管理的用户的结果。我尝试过使用 CTE 但仍然没有成功。
我想要的,
- 第一个查询 select 其
user name = @name
的行
- 第二个查询:return 个由(第一个查询
ManagerId
) 管理的用户
- 第三个查询: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