1

假设如下表

| ID |  NAME | ROLE | MGRID |
---------------------------
|  1 |   ONE |    5 |   5 |
|  2 |   TWO |    5 |   5 |
|  3 | THREE |    5 |   6 |
|  4 |  FOUR |    5 |   6 |
|  5 |  FIVE |   15 |   7 |
|  6 |   SIX |   25 |   8 |
|  7 | SEVEN |   25 |   7 |
|  8 | EIGHT |    5 |   8 |

如何获取向员工报告的所有员工的列表,包括处于以下后续报告级别的员工?

我的意思是,给定 emp id 5,我应该得到 [1, 2],给定 7,我应该得到 [1, 2, 5, 7]。我该怎么做?

自我加入在这里会有所帮助吗?现在需要复习我对连接的了解。

4

3 回答 3

2
SELECT id
      FROM emp
START WITH id = 7
CONNECT BY NOCYCLE mgrid = PRIOR id

SQLFIDDLE链接

于 2013-08-06T16:02:28.783 回答
1

这是使用 Oracle 的 SQL 语句。

select  id, name, role, mgrID
from employees
start with id = 7
connect by NoCycle prior id = mgrid;

请注意,员工 7 的经理是员工 7 - 他们是他们自己的经理。这将导致错误 - “通过用户数据中的循环连接”。通过使用 NoCycle 关键字,您可以告诉 Oracle 检测到这一点并避免错误。

这能解决您的问题吗?

于 2013-08-06T16:06:11.263 回答
0

我知道这不是您要问的,但是如果您愿意选择有限数量的级别进行递归,那么写起来还不错。

SELECT table_2.id
FROM table LEFT JOIN 
  (table AS table_1 LEFT JOIN table AS table_2 ON table_1.id = table_2.MgrID)
ON table.id = table_1.MgrID
WHERE (((table.id)=7));

等等。

于 2013-08-06T16:02:04.707 回答