Oracle递归查询

创建表:

 1 CREATE TABLE SC_DISTRICT
 2 (
 3   ID         NUMBER(10)                  NOT NULL,
 4   PARENT_ID  NUMBER(10),
 5   NAME       VARCHAR2(255 BYTE)          NOT NULL
 6 );
 7 
 8 ALTER TABLE SC_DISTRICT ADD (
 9   CONSTRAINT SC_DISTRICT_PK
10  PRIMARY KEY
11  (ID));
12 
13 ALTER TABLE SC_DISTRICT ADD (
14   CONSTRAINT SC_DISTRICT_R01 
15  FOREIGN KEY (PARENT_ID) 
16  REFERENCES SC_DISTRICT (ID));

插入数据:

 1 INSERT INTO SC_DISTRICT(ID,NAME) VALUES(1,'四川省');
 2 
 3 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(2,1,'巴中市');
 4 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(3,1,'达州市'); 
 5 
 6 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(4,2,'巴州区');
 7 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(5,2,'通江县');
 8 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(6,2,'平昌县');
 9 
10 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(7,3,'通川区');
11 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(8,3,'宣汉县');
12 
13 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(9,8,'塔河乡');
14 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(10,8,'三河乡');
15 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(11,8,'胡家镇');
16 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(12,8,'南坝镇');
17  
18 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(13,6,'大寨乡');
19 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(14,6,'响滩镇');
20 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(15,6,'龙岗镇');
21 INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(16,6,'白衣镇');

生成表如下:

查询某节点的所有子孙节点

 1 --查询巴中市下面的所有行政组织(结果包含当前节点):
 2 SELECT *
 3 FROM SC_DISTRICT
 4 START WITH NAME='巴中市'
 5 CONNECT BY PRIOR ID=PARENT_ID
 6 
 7 --查询结果:
 8 ID    PARENT_ID      NAME
 9 2    1            巴中市
10 4    2            巴州区
11 5    2            通江县
12 6    2            平昌县
13 13    6            大寨乡
14 14    6            响滩镇
15 15    6            龙岗镇
16 16    6            白衣镇

查询指定节点的递归根节点

 1 --查询响滩镇镇所属的市:
 2 SELECT ID,   PARENT_ID,      NAME,     
 3        CONNECT_BY_ROOT(ID)   CITY_ID,
 4        CONNECT_BY_ROOT(NAME) CITY_NAME
 5 FROM   SC_DISTRICT
 6 WHERE  NAME='响滩镇' 
 7        START WITH PARENT_ID=1
 8        CONNECT BY PRIOR ID=PARENT_ID
 9 --查询结果:
10 ID        PARENT_ID    NAME    CITY_ID    CITY_NAME
11 14        6            响滩镇  2          巴中市

CONNECT BY子句伪列的应用

 1 --LEVEL:查询节点层次,从1开始。
 2 --CONNECT_BY_ISLEAF:查询节点是否是叶子节点,是则为1,不是则为0
 3 SELECT   ID,   NAME,   PARENT_ID,   LEVEL,   CONNECT_BY_ISLEAF
 4 FROM     SC_DISTRICT
 5          START WITH NAME='巴中市'
 6          CONNECT BY PRIOR ID=PARENT_ID 
 7          ORDER BY ID;
 8 
 9 --查询结果:
10 ID    NAME    PARENT_ID    LEVEL    CONNECT_BY_ISLEAF
11 2    巴中市    1    1    0
12 4    巴州区    2    2    1
13 5    通江县    2    2    1
14 6    平昌县    2    2    0
15 13    大寨乡    6    3    1
16 14    响滩镇    6    3    1
17 15    龙岗镇    6    3    1
18 16    白衣镇    6    3    1

查询递归路径

 1 --查询巴中市下行政组织递归路径
 2 SELECT  ID,     NAME,   PARENT_ID,
 3         SUBSTR(SYS_CONNECT_BY_PATH(NAME,'->'),3)   NAME_PATH
 4 FROM    SC_DISTRICT
 5         START   WITH NAME='巴中市'
 6         CONNECT BY PRIOR ID=PARENT_ID
 7         
 8 --查询结果:
 9 ID    NAME    PARENT_ID    NAME_PATH
10 2    巴中市    1    巴中市
11 4    巴州区    2    巴中市->巴州区
12 5    通江县    2    巴中市->通江县
13 6    平昌县    2    巴中市->平昌县
14 13    大寨乡    6    巴中市->平昌县->大寨乡
15 14    响滩镇    6    巴中市->平昌县->响滩镇
16 15    龙岗镇    6    巴中市->平昌县->龙岗镇
17 16    白衣镇    6    巴中市->平昌县->白衣镇

转自:http://www.cnblogs.com/wanghonghu/archive/2012/08/31/2665945.html

原文地址:https://www.cnblogs.com/sm21312/p/4054141.html