– 层次查询
– 遍历树
从底向上
1.查询雇员编号为7876的员工信息,以及从底向上的上级经理信息。 select * from emp where empno = 7876 union select * from emp where empno = 7788 union select * from emp where empno = 7566 union select * from emp where empno = 7839; select * from emp start with empno=7876 connect by prior mgr = empno;--empno 父列 mgr子列(优先级高) -- prior 跟谁谁的级别高 select * from emp start with empno=7876 connect by empno = prior mgr;--同上
从上往下
-- 查询雇员编号为7839的员工信息,并按照从顶向下的顺序查上级经理信息 select empno, ename, job, mgr from emp start with empno = 7839 connect by prior empno = mgr; -- 通过prior关键字,获取上下级员工信息 select empno, ename, job, mgr,prior ename, prior mgr from emp strat with empno = 7839 connect by prior empno = mgr;
LEVEL查看分层等级信息
select level,e.* from emp e start with ename='KING' connect by prior empno = mgr; --用 LEVEL和LPAD生成分级报告 select level, e.empno, e.ename, e.mgr, lpad(e.ename,length(e.ename) + level*2,'-') from emp e start with ename='KING' connect by prior empno = mgr;
修剪分支
--去除一个节点:在where中添加判断条件 1.从上往下查询编号为7839的所有员工信息,不包括编号为7788的员工 select * from emp where empno<>7788 start with empno=7839 connect by prior empno = mgr; --去除一个分支:在connect by后添加判断条件 1.从上往下查询编号为7839的所有员工信息,不包括编号为7698的员工及分支信息 select * from emp start with empno=7839 connect by prior empno = mgr and empno <> 7698;
案例理解
select i.*,rowid from menu i; --创建菜单表 create table MENU ( id NUMBER(5) not null, menu VARCHAR2(50), fatherid NUMBER(5) ) --新增菜单数据 --delete from MENU; insert into MENU (id, menu, fatherid) values (0, '总菜单',null); insert into MENU (id, menu, fatherid) values (1, '服装', 0); insert into MENU (id, menu, fatherid) values (2, '鞋包', 0); insert into MENU (id, menu, fatherid) values (3, '美食', 0); insert into MENU (id, menu, fatherid) values (4, '运动', 0); insert into MENU (id, menu, fatherid) values (5, '女装', 1); insert into MENU (id, menu, fatherid) values (6, '男装', 1); insert into MENU (id, menu, fatherid) values (7, '户外健身', 4); insert into MENU (id, menu, fatherid) values (8, '大码女装', 5); commit; 菜单栏 id menu fatherId 0 总菜单 1 服装 0 --一级菜单 2 鞋包 0 --一级菜单 3 美食 0 --一级菜单 4 运动 0 --一级菜单 5 女装 1 --二级菜单 6 男装 1 --二级菜单 7 户外健身 4 --二级菜单 8 大码女装 5 --三级菜单 -- 1.产生一个报告,显示所有的以编号为0的菜单开始的菜单编号,菜单名称, -> 以及父级菜单名称。(中文字符占2个长度) select level, m.*, prior menu, --获取上级菜单的名称 length(menu)*2 长度, (length(menu)*2 + level * 2) 补全长度, --!!!中文字符占2个长度 lpad(menu, length(menu)*2 + level * 2, '*') 格式化菜单信息 from menu m start with id = 0 --从当前节点开始查询 connect by prior id = fatherId; --prior id 父列(主列):从顶向下 prior fatherId子列(从列) :从底向上 2.产生一个报告,显示所有的菜单信息,由上往下查询,不包括编号为2与3的分支 select level,m.* from menu m start with id=0 connect by prior id = fatherid and id not in(2,3);