SQL查询:级联“管理器”查询问题

时间:2011-03-03 18:45:06

标签: sql sql-server-2005

我有一个员工及其直接经理的数据库。每个员工行都有一个ManagerId列。如果我运行报告以查看哪些员工向“Bob”报告,我会在ManagerId列中获得具有“Bob's”ID的员工列表。这对于找出谁直接向Bob报告但是我想看到向Bob报告的每个人或向Bob报告的任何董事,经理或主管都很好。

我该怎么做?

编辑1 - 这适用于SQL Server 2005/2008。我希望Bob下的所有员工,而不仅仅是那些直接向他报告的员工。

2 个答案:

答案 0 :(得分:0)

如果您的数据库支持分层查询,则可以执行此操作。您使用的是哪个数据库。

对于Oracle:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/queries003.htm

对于SQL Server(我相信来自11g R2的Oracle也支持ANSI SQL语法),请查看此链接。

http://msdn.microsoft.com/en-us/library/ms186243.aspx

答案 1 :(得分:0)

或者,在SQL Server的最新版本中,您可以通过递归公用表表达式完成此操作。

请参阅this MSDN question及其答案。引用:

WITH EmpCTE(empid, empname, mgrid, IsRoot)
AS
(

 -- Anchor Member (AM)
 SELECT empid, empname, mgrid, CASE WHEN mgrid IS NULL THEN 1 ELSE 0 END IsRoot
 FROM Employees
 WHERE empid = @empid

 UNION ALL

 -- Recursive Member (RM)
 SELECT M.empid, M.empname, M.mgrid, CASE WHEN M.mgrid IS NULL THEN 1 ELSE 0 END
 FROM Employees AS M
  JOIN EmpCTE AS E
   ON E.mgrid = M.empid
)
SELECT * FROM EmpCTE
GO

那会给你一个起点。