在Oracle SQL中连接

dat*_*ili 14 sql oracle hierarchical-query

假设我们有以下表格

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  )
Run Code Online (Sandbox Code Playgroud)

create table job (
  2    EMPNO         NUMBER(3),
  3    jobtitle      VARCHAR2(20 BYTE)
  4  )
  5  /
Run Code Online (Sandbox Code Playgroud)

我对以下查询的作用感兴趣

SELECT empno, manager_id, ename
  2  FROM employee
  3  START WITH empno = 1
  4  CONNECT BY PRIOR empno = manager_id;
Run Code Online (Sandbox Code Playgroud)

我的理解,这个代码选择empno,manager_id,ename从员工,它开始选择从该行地方empno=1,但不明白这行做了什么:

CONNECT BY PRIOR empno = manager_id;
Run Code Online (Sandbox Code Playgroud)

这是一样的:

where empno=manager_id?
Run Code Online (Sandbox Code Playgroud)

man*_*ada 11

CONNECT BY PRIOR empno = manager_id;
Run Code Online (Sandbox Code Playgroud)

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

30 (manager_id)
   12 
   5 (manager_id)
      1
      7
20 (manager_id)
   15
   10
Run Code Online (Sandbox Code Playgroud)


alf*_*sin 5

该查询是递归的,它从1号雇员(可能是CEO)开始,然后递归打印其所有下属,然后依次打印其所有下属,依此类推(直到所有雇员都被打印)。

此处可以找到有关“ START WITH”和“ CONNECT BY”的详细说明