Oracle层次树查询
Oracle层次树是通过Connect by [条件] Start with [条件] 来实现。这一功能非常好用,比如ERP中的BOM、HR中的组织架构,就算是这类的典型应用了。不过,Oracle EBS11i中好象没实现,BOM也没有使用树这种组件。
下面就做一个简单的MRP试算过程,来说明层次树的应用。
1.1 建一个简单BOM表。
create table hek_bom( master_id varchar2(20), master_name varchar2(50), sub_id varchar(20), sub_name varchar(20) )
1.2 放入测试数据。
begin
insert into hek_bom values('0001','V1卡车','10001','V1发动机');
insert into hek_bom values('0001','V1卡车','10002','V1车架'); i
nsert into hek_bom values('0001','V1卡车','10003','V1车轮');
insert into hek_bom values('0002','V2卡车','10001','V1发动机');
insert into hek_bom values('0002','V2卡车','10002','V1车轮');
insert into hek_bom values('0002','V2卡车','10004','V2车架');
insert into hek_bom values('0003','V3卡车','10004','V1发动机');
insert into hek_bom values('0004','V4卡车','10005','V2发动机');
insert into hek_bom values('10001','V1发动机','10006','V1活塞');
insert into hek_bom values('10001','V1发动机','10007','V1火花器');
insert into hek_bom values('10007','V1活塞','10008','V1橡胶片');
insert into hek_bom values('10007','V1活塞','10009','V1螺丝');
end;
1.3 查询一下明细:
select t.* from hek_bom t for update
------------------------
1 0001 V1卡车 10001 V1发动机
2 0001 V1卡车 10002 V1车架
3 0001 V1卡车 10003 V1车轮
4 0002 V2卡车 10001 V1发动机
5 0002 V2卡车 10002 V1车轮
6 0002 V2卡车 10004 V2车架
7 0003 V3卡车 10004 V1发动机
8 0004 V4卡车 10005 V2发动机
9 10001 V1发动机 10006 V1活塞
10 10001 V1发动机 10007 V1火花器
11 10006 V1活塞 10008 V1橡胶片
12 10006 V1活塞 10009 V1螺丝
1.4 问题:求V1螺丝料品有哪几层产品用到。
select level,t.* from hek_bom t connect by prior t.master_id=t.sub_id start with t.sub_id='10009'
--注意这条SQL语名的语法,connect by prior t.master_id=t.sub_id表示优先从子节点到父节点。
--start with t.sub_id='10009'相当于where t.sub_id='10009'
---------------------------------------------
1 10006 V1活塞 10009 V1螺丝
2 10001 V1发动机 10006 V1活塞
3 0001 V1卡车 10001 V1发动机
4 0002 V2卡车 10001 V1发动机
1.5 问题:求:V1卡车的BOM结构:
select level,t.* from hek_bom t connect by prior t.sub_id=t.master_id start with t.master_name='V1卡车'
--connect by prior t.sub_id=t.master_id表示优先从父节点查询到子节点。
---------------------------------------------------------------------------------------------
1 0001 V1卡车 10001 V1发动机
2 10001 V1发动机 10006 V1活塞
3 10006 V1活塞 10008 V1橡胶片
4 10006 V1活塞 10009 V1螺丝
5 10001 V1发动机 10007 V1火花器
6 0001 V1卡车 10002 V1车架
7 0001 V1卡车 10003 V1车轮
―――――――――――――――――――――――――――――――――――――
通过这两个例子,已经可以很形象地说明connect by 的典型应用了。