【问题标题】:SQL Query: Cascading "Managers" query problemSQL 查询:级联“经理”查询问题
【发布时间】:2011-07-08 06:57:40
【问题描述】:

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

我该怎么做?

编辑 1 - 这是针对 SQL Server 2005 / 2008 的。我希望 Bob 手下的所有员工,而不仅仅是直接向他汇报的员工。

【问题讨论】:

  • 你使用的是什么 SQL 实现?
  • 我无法确定您的问题是什么。因此,您可以获取所有向 Bob 汇报的员工,但您无法获取同时向 Bob 汇报的董事、经理或主管的员工?
  • @FreeAsInBeer - 他基本上想要递归层次结构。
  • @FreeAsInBeer 他想查看 Bob 的所有下属,即使他们不是 直接 下属(即他想见向 Alice 汇报的 Mitch,Alice 向Fred,他向 Bob 汇报)。

标签: sql sql-server-2005


【解决方案1】:

如果您的数据库支持,您可以使用分层查询来做到这一点。您正在使用哪个数据库。

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

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

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

【讨论】:

  • 你有两次相同的链接,孩子。 :)
【解决方案2】:

或者,在 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

这将为您提供一个起点。

【讨论】:

  • 别名让我头疼 - E for ManagerM for Employee?
  • 注意加入条件:来自M的记录经理。这是 OP 场景的一个反向示例,但技术仍然有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
相关资源
最近更新 更多