假设一个表格如下
| 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]。我怎么做到这一点?
自我加入会在这里有所帮助吗?现在需要了解我对连接的了解。
答案 0 :(得分:2)
SELECT id
FROM emp
START WITH id = 7
CONNECT BY NOCYCLE mgrid = PRIOR id
SQLFIDDLE LINK
答案 1 :(得分:1)
这是使用Oracle的SQL语句。
select id, name, role, mgrID
from employees
start with id = 7
connect by NoCycle prior id = mgrid;
请注意,员工7的经理是员工7 - 他们是自己的经理。这将导致错误 - “用户数据中的连接循环”。通过使用NoCycle关键字,您可以告诉Oracle检测到这一点并避免错误。
这会解决您的问题吗?
答案 2 :(得分: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));
ETC。