好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

oracle递归查询-个人总结

首先,建表: create table T_TEST_WORD( id NUMBER, pid VARCHAR2(20), name VARCHAR2(20)) 插入数据: insert into T_TEST_WORD (id, pid, name)values (1, '-1', '中国');insert into T_TEST_WORD (id, pid, name)values (2, '1', '江苏');insert into T_

首先,建表:

create table T_TEST_WORD
(
  id   NUMBER,
  pid  VARCHAR2(20),
  name VARCHAR2(20)
) 


插入数据:


insert into T_TEST_WORD (id, pid, name)
values (1, '-1', '中国');
insert into T_TEST_WORD (id, pid, name)
values (2, '1', '江苏');
insert into T_TEST_WORD (id, pid, name)
values (3, '1', '浙江');
insert into T_TEST_WORD (id, pid, name)
values (4, '2', '南京');
insert into T_TEST_WORD (id, pid, name)
values (5, '2', '无锡');
insert into T_TEST_WORD (id, pid, name)
values (6, '1', '安徽');
insert into T_TEST_WORD (id, pid, name)
values (7, '4', '雨花台区');
insert into T_TEST_WORD (id, pid, name)
values (8, '-1', '美国');
insert into T_TEST_WORD (id, pid, name)
values (9, '-1', '俄罗斯');
commit; 

查询下表中的数据:

表1



其中PID为-1的代表根节点。


开始进行递归查询:

查询结果如下:

表2



说明:

select ... from tablename(表名) where 条件1 start with 条件2 connect by 条件3 and 条件4 ...


看下这个语句 (由根节点向子节点查询) :


select t.* , level from T_TEST_WORD t start with pid='-1' connect by prior id = pid(由根节点向子节点查询)


从T_TEST_WORD表中查询所有记录,从pid=-1的开始查询,且 上一次查询记录的id作为本次查询的pid ,以上表为例,举例如下:

第一次查询出pid=-1的记录是 id为1 的那条。

第二次查询时,查询pid=1的(上次查询记录的 id是1 )记录,可以查询到 id为2 的那条记录

第三次查询时,查询pid=2的(上次查询记录的 id是2 )记录,可以查询到id为4的那条记录,以此类推......

由上,查询到了表2的记录。


由树的根节点向子节点查询时,查询节点的顺序是按照树的前序遍历(DLR)进行的(1,2,4,7,5,3,6,8,9),如下图1

图1:


(比较丑的图,凑合看吧,嘻嘻)

注意:那个level要有 start with ...... connect by ...... 才有效哦,不然会报错的。


再看这句 (由子节点向根节点查询) :

select t.* ,level from T_TEST_WORD t start with pid='2' connect by  id = prior pid 

从pid=2的开始(向上)查询,且 上一次查询记录的pid作为本次查询的id




prior 挨着谁,就将谁作为本次查询的某某关键字,比如connect by id = prior pid,就是将上次的pid作为本次查询的id。

注意,level是伪列,查询数据所对应的级,或者说深度吧。


小菜的总结,有问题请指出,谢谢咯!

查看更多关于oracle递归查询-个人总结的详细内容...

  阅读:34次