【发布时间】:2015-08-20 07:42:31
【问题描述】:
我有一个至少包含三列的表,EMPLID、NAME、SUPERVISOR_ID。在单个查询中,当在 WHERE 子句中给定 managerid 时,我想获得经理的直接下属,包括从下属经理一直到最低员工的任何直接下属。
我可以创建一个查询来显示谁向谁报告:
SELECT MANAGER.[EMPLID] AS MANAGEREMPLID, MANAGER.[NAME], MANAGER.[SUPERVISOR_ID], STAFF.[EMPLID] AS STAFFEMPLID, STAFF.[NAME], STAFF.[SUPERVISOR_ID]
FROM MYHRTABLE AS MANAGER INNER JOIN MYHRTABLE AS STAFF
ON MANAGER.[EMPLID] = STAFF.[SUPERVISOR_ID]
ORDER BY MANAGER.[NAME], STAFF.[NAME]
或看似做同样事情的递归 CTE
WITH MYCTE
AS (
SELECT [EMPLID], [NAME],[SUPERVISOR_ID] FROM
(SELECT [EMPLID], [NAME],
CASE WHEN [EMPLID] = [SUPERVISOR_ID] THEN NULL ELSE [SUPERVISOR_ID] END AS [SUPERVISOR_ID]
FROM MYHRTABLE) AS MYDATA
WHERE [SUPERVISOR_ID] IS NULL
UNION ALL
SELECT MYDATA.[EMPLID], MYDATA.[NAME],MYDATA.[SUPERVISOR_ID] FROM
(SELECT [EMPLID], [NAME],
CASE WHEN [EMPLID] = [SUPERVISOR_ID] THEN NULL ELSE [SUPERVISOR_ID] END AS [SUPERVISOR_ID]
FROM MYHRTABLE) AS MYDATA INNER JOIN MYCTE ON MYDATA.[SUPERVISOR_ID] = MyCTE.[EMPLID]
WHERE MYDATA.[SUPERVISOR_ID] IS NOT NULL)
SELECT * FROM MyCTE
(案例陈述是因为最高管理者有主管领域向自己汇报)
我一直在寻找的是能够为这个查询提供一个 emblid 并一直看到向该经理报告的员工的能力。在我的两个示例中,我觉得我可以看到直接下属,但不知何故,我应该再次加入以查看其余信息。
第二个问题是相关的,在研究这个问题时,似乎大多数人解决了使用递归 cte 找到经理直接下属的问题,而我认为它可以使用连接到自身的第一个查询来解决。鉴于我发布的两个查询,当我可以使用连接到自身的同一个表时,为什么还要使用递归 CTE 来解决它?好像我得到了相同的信息?
如果有任何意义,它将在 SQL Server 2012 或 2008 上运行。
【问题讨论】:
标签: sql sql-server-2008 tsql sql-server-2012 recursive-cte