技术开发 频道

ORACLEERP开发基础之Oracle数据库基础

  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 的典型应用了。

0
相关文章