Oracle中的递归查询

我们假设有如下一张机构表(ORG):

字段类型

字段名称

字段描述

NUMBER(16)

ID

机构ID

NUMBER(16)

PARENT_ID

父机构ID

VARCHAR2(100)

NAME

机构名称

NUMBER(1)

ENABLE

是否启用,1表示启用,0表示停用

表中有如下几行数据:

ID

PARENT_ID

NAME

ENABLE

1314

1399

信用卡后勤保障部

1

1399

5000

信用卡后勤部

1

1414

5000

信用卡业务部

0

5000

8888

信用卡总部

1

8888

9000

银行卡总部

1

9000

10000

业务部

1

10000

-1

总部

1

在Oracle中,我们可以采用如下语句来进行递归查询:

select ID, PARENT_ID from ORG  where [条件列表1] start with  [递归起始条件connect by prior [递归条件

其中,条件列表1用来对查询出的所有的数据进行过滤,递归起始条件用于定义递归数据的起点,而递归条件用于定义递归的规则。

对于上面提到的ORG表,如果我们想查出信用卡后勤部的ID和它的所有启用的上级机构的ID,就可以用如下语句:

      select ID from ORG  where ENABLE = 1 start with ID = 1399 connect by prior PARENT_ID = ID

如上,我们要查的所有机构必须是启用的,所以在where语句后面加了ENABLE = 1这一全局条件,信用卡后勤部的机构ID为1399,所以我们在start with语句后面加了ID = 1399,我们得根据这个ID行的PARENT_ID来找出其父机构,又要根据其父机构的 PARENT_ID来找出父机构的父机构,以此类推,所以我们在connect by prior 语句后面加了PARENT_ID = ID。

下面给出查询结果:

ID

1399

5000

8888

9000

10000

你可能会想到,如果把 connect by prior 语句后面的条件写成 ID = PARENT_ID,结果会怎样呢?

请看如下语句的结果:

      select ID from ORG  where ENABLE = 1 start with ID = 1399 connect by prior ID = PARENT_ID

ID

1399

1314

你想的没错!它把信用卡后勤部及其下属部门的机构ID都查出来了,所以connect by prior 语句后面的条件“=”两边的条件顺序直接影响着结果!

猜你喜欢

转载自manzhizhen.iteye.com/blog/2112291