在Oracle SQL中的Connect by

15

假设我们有以下表格:

create table Employee(
  2    EMPNO         NUMBER(3),
  3    ENAME         VARCHAR2(15 BYTE),
  4    HIREDATE      DATE,
  5    ORIG_SALARY   NUMBER(6),
  6    CURR_SALARY   NUMBER(6),
  7    REGION        VARCHAR2(1 BYTE),
  8    MANAGER_ID    NUMBER(3)
  9  )

并且

create table job (
  2    EMPNO         NUMBER(3),
  3    jobtitle      VARCHAR2(20 BYTE)
  4  )
  5  /

我对下面的查询语句很感兴趣

SELECT empno, manager_id, ename
  2  FROM employee
  3  START WITH empno = 1
  4  CONNECT BY PRIOR empno = manager_id;

据我理解,这段代码从employee表中选择empno、manager_id和ename列,它从满足 empno=1 条件的行开始选择,但是我无法理解这一行代码的作用:


but could not understand what this line does:
CONNECT BY PRIOR empno = manager_id;

这是同一个意思吗:

where empno=manager_id?

2
Docs - turbanoff
2个回答

12
CONNECT BY PRIOR empno = manager_id;

这将产生递归。所有属于下一个更低的分层级别的记录都将返回。这将为所有经理及其各自的下属工作人员从上到下返回一个层次结构。

30 (manager_id)
   12 
   5 (manager_id)
      1
      7
20 (manager_id)
   15
   10

1
那么,我如何判断是否需要编写类似这样的代码来选择某些内容呢? - user466534
1
只需在需要以层次结构方式获取具有父子关系的内容时使用。 - manurajhada

6

这个查询是递归的,它从员工#1(可能是CEO)开始,然后递归地打印出他的所有下属,以及所有下属的下属等等(直到所有员工都被打印出来)。

关于"START WITH"和"CONNECT BY"的良好解释可以在这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接