/*Sql递归查询*/
/*实际就是把所有树的节点查找出来
Oracle的一个表中也可以保存树形结构信息,用start with...connect by等关键字
eg:创建表并插入数据*/
Create table Tree(son char(10),father char(10));insert into tree (SON, FATHER) values ('孙子1', '儿子');insert into tree (SON, FATHER) values ('孙子2', '儿子');insert into tree (SON, FATHER) values ('儿子', '父亲');insert into tree (SON, FATHER) values ('父亲', '祖父');/*son father
孙子1 儿子
孙子2 儿子
儿子 父亲
父亲 祖父
数据结构是:
祖父
|
父亲
|
儿子
/ \
孙子1 孙子2*/
--查询以祖父为根节点的所有节点值
SELECT son from Tree START WITH father='祖父' CONNECT BY PRIOR son=father/*START WITH后的内容可以看成一个WHERE的限制条件,其中START WITH 是指定树的根
,还可以指定多个根,比如father in ('祖父','父亲');
CONNECTION BY PRIOR son=father相当于表明在递归过程中,查找到的树种其他节点接着
又作为根结点,然后继续递归。
只要记住 CONNECTION BY PRIOR那一行,要查询的列名放在前,根列名放等号后*/
--例:
--树形菜单结构
CREATE TABLEtb_menu(
idnumber(10) not null,--主键id
title varchar(50),--标题
parent number(10) --父菜单id
);--父菜单数据
insert into tb_menu(id,title,parent) values(1,'父菜单1',0);insert into tb_menu(id,title,parent) values(2,'父菜单2',0);insert into tb_menu(id,title,parent) values(3,'父菜单3',0);insert into tb_menu(id,title,parent) values(4,'父菜单4',0);insert into tb_menu(id,title,parent) values(5,'父菜单5',0);--一级子菜单
insert into tb_menu(id,title,parent) values(6,'一级子菜单6_1',1);insert into tb_menu(id,title,parent) values(7,'一级子菜单7_1',1);insert into tb_menu(id,title,parent) values(8,'一级子菜单8_1',1);insert into tb_menu(id,title,parent) values(9,'一级子菜单9_2',2);insert into tb_menu(id,title,parent) values(10,'一级子菜单10_2',2);insert into tb_menu(id,title,parent) values(11,