表中的自联接和递归选择

时间:2013-08-06 15:20:29

标签: mysql sql database oracle join

假设一个表格如下

| 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]。我怎么做到这一点?

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

3 个答案:

答案 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。