在整個BOM中,動態地指定修改其中某一層,則其子項隨其修改項做出對應變更。

EMPLOYEE_ID

MANAGER_ID

NAME

CREATE_DATE

LEVEL

100

NULL

King

2000-12-12

1

148

100

Cambrault

2009-01-01

2

172

148

Bates

2010-11-01

3

169

148

Bloom

2011-08-21

3

170

148

Fox

2009-03-01

3

173

148

Kumar

2009-06-11

3

168

148

Ozer

2009-10-07

3

171

148

Smith

2012-05-01

3

102

100

DeHaan

2012-01-01

2

103

102

Hunold

2009-12-03

3

105

103

Austin

2011-01-01

4

104

103

Ernst

2011-11-01

4

107

103

Lorentz

2012-11-01

4

106

103

Pataballa

2009-01-01

4

147

100

Errazuriz

2010-11-23

2

166

147

Ande

2010-12-14

3

167

147

Banda

2009-09-01

3

--create table
create table kol_employees_tmp
(
employee_id   number(5) not null,
name          varchar2(50) not null,
manager_id    number(5) ,
create_date   date
)--insert data
begininsert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(172,'Bates',148,to_date('2010-11-01', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(169,'Bloom',148,to_date('2011-08-21', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(173,'Kumar',148,to_date('2009-06-11', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(168,'Ozer',148,to_date('2009-10-07', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(100,'King',null,to_date('2009-01-01', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(148,'Cambrault',100,to_date('2009-01-01', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(170,'Fox',148,to_date('2009-03-01', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(147,'Errazuriz',100,to_date('2010-11-23', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(167,'Banda',147,to_date('2009-09-01', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(103,'Hunold',102,to_date('2009-12-03', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(166,'Ande',147,to_date('2010-12-14', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(171,'Smith',148,to_date('2012-05-01', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(102,'DeHaan',100,to_date('2012-01-01', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(107,'Lorentz',103,to_date('2012-11-01', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(106,'Pataballa',103,to_date('2009-01-01', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(105,'Austin',103,to_date('2011-01-01', 'YYYY-MM-DD'));
insert into kol_employees_tmp(employee_id, name, manager_id, create_date) values(104,'Ernst',103,to_date('2011-11-01', 'YYYY-MM-DD'));end;

--create temp table
with kol_employees_tmp as(
select '2010-11-01' create_date, 172 employee_id, 148 manager_id, 'Bates' name from dual
union all
select null create_date, 169 employee_id, 148 manager_id, 'Bloom' name from dual
union all
select null create_date, 173 employee_id, 148 manager_id, 'Kumar' name from dual
union all
select null create_date, 168 employee_id, 148 manager_id, 'Ozer' name from dual
union all
select '2000-04-04' create_date, 100 employee_id, null manager_id, 'King' name from dual
union all
select null create_date, 148 employee_id, 100 manager_id, 'Cambrault' name from dual
union all
select null create_date, 170 employee_id, 148 manager_id, 'Fox' name from dual
union all
select '2010-11-23' create_date, 147 employee_id, 100 manager_id, 'Errazuriz' name from dual
union all
select '2009-09-01' create_date, 167 employee_id, 147 manager_id, 'Banda' name from dual
union all
--select '2009-12-03' create_date, 103 employee_id, 102 manager_id, 'Hunold' name from dual
select '2013-12-03' create_date, 103 employee_id, 102 manager_id, 'Hunold' name from dual
union all
select null create_date, 166 employee_id, 147 manager_id, 'Ande' name from dual
union all
select null create_date, 171 employee_id, 148 manager_id, 'Smith' name from dual
union all
select '2012-01-01' create_date, 102 employee_id, 100 manager_id, 'DeHaan' name from dual
union all
select null create_date, 107 employee_id, 103 manager_id, 'Lorentz' name from dual
union all
select '2009-01-01' create_date, 106 employee_id, 103 manager_id, 'Pataballa' name from dual
union all
--select '2011-01-01' create_date, 105 employee_id, 103 manager_id, 'Austin' name from dual
select '2018-01-01' create_date, 105 employee_id, 103 manager_id, 'Austin' name from dual
union all
select null create_date, 104 employee_id, 103 manager_id, 'Ernst' name from dual
)
,
condition_list  as(
select emp.employee_id,emp.manager_id,emp.name,emp.create_date,level level_id
from kol_employees_tmp emp
where 1=1
and emp.create_date is not null
--start with emp.employee_id = :p_root_item -- itme no
start with emp.employee_id = 100 -- itme no
connect by prior emp.employee_id = emp.manager_id
)
,
redo_employees as(
select t2.employee_id,t2.manager_id,t2.name,t2.create_date,t2.parent_create_date,t2.level_id
from(select t1.employee_id,t1.manager_id,t1.name,t1.create_date,t1.parent_create_date,                t1.level_id,--t1.path,--t1.isleaf,                  row_number() over(partition by t1.employee_id, t1.manager_id order by t1.parent_create_date desc) maxover_seqfrom(select emp.employee_id,emp.manager_id,emp.name,emp.create_date,connect_by_root(emp.create_date) parent_create_date,                                          level level_id--sys_connect_by_path(emp.employee_id || decode(emp.manager_id,null, '', '*' || emp.manager_id), '/') path,      --connect_by_isleaf isleaffrom kol_employees_tmp empwhere 1=1--and emp.employee_id in( 102, 105, 106, 147, 167,172)             -- start with emp.employee_id = 100  start with emp.employee_id in(select cl.employee_id from condition_list cl)     --in( 102, 105, 106, 147, 167,172, 103)     connect by prior emp.employee_id = emp.manager_id--order siblings by emp.name
        ) t1) t2
where 1=1
and t2.maxover_seq = 1
---------------------
union all
select ket2.employee_id,ket2.manager_id,ket2.name,ket2.create_date,ket2.create_date parent_create_date,level level_id
from kol_employees_tmp ket2
--start with ket2.employee_id = decode( (select count(1) from condition_list where employee_id = :p_root_item), 0, :p_root_item, '-1') -- itme no
start with ket2.employee_id = decode( (select count(1) from condition_list where employee_id = 100), 0, 100, '-1') -- itme no
connect by     ket2.employee_id not in(select cl.employee_id from condition_list cl)  --in( 102, 105, 106, 147, 167,172, 103) -- break level
and prior ket2.employee_id = ket2.manager_id
)
--query process tables
select emp.employee_id,emp.manager_id,emp.name,emp.create_date,emp.parent_create_date,level level_id
from redo_employees emp
--start with emp.employee_id = :p_root_item  -- itme no
start with emp.employee_id = 100  -- itme no
connect by prior emp.employee_id = emp.manager_id
order siblings by emp.name;

转载于:https://www.cnblogs.com/quanweiru/archive/2012/11/18/2775843.html

Oracle.start with … connect by [… and] prior…order siblings by …相关推荐

  1. Oracle start with connect by prior 使用总结

    目录 定义 举个栗子 第一种情况 第二种情况 第三种情况 第四种情况 总结 定义 start with: 指定起始节点的条件,可以放父级条件,也可以放子级条件 connect by: 连接条件 pri ...

  2. Oracle递归查询,Oracle START WITH……CONNECT BY查询

    Oracle递归查询,Oracle START WITH--CONNECT BY查询,Oracle树查询 ================================ ©Copyright 蕃薯耀 ...

  3. oracle 层次查询 connect by

    Hierarchical Queries 语法 connect by [nocycle] condition [start with condition] start with condition c ...

  4. oracle树结构查询----connect by语法详解

    connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start with 条件1 connect by 条件2 where 条件3; 例: ...

  5. oracle until freed,Oracle中报错Connect internal only, until freed

    Oracle中报错Connect internal only, until freed属于归档日志满了. 有两种方法可以解决,第一种是删除归档日志,第二种是增大闪回日志文件的最大大小 SQL> ...

  6. Oracle start with.connect by prior子句实现递归查询

    Oracle中的select语句可以用start with...connect by prior子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: select ... fr ...

  7. 在oracle中通过connect by prior来实现递归查询!

    connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start by cond1 connect by cond2 where cond3; ...

  8. Oracle START WITH ... CONNECT BY PRIOR 带条件会有重复

    2019独角兽企业重金招聘Python工程师标准>>> 解决方案:http://blog.csdn.net/zy_crazy_code/article/details/5240332 ...

  9. oracle 数据库中 connect by 和level 的用法

    这几天看sql看到了有关connect by和level的关键字用法,以前都用mysql也没用过这个关键字,感觉挺有用的,就学了下,整理一下学习过程. 首先,connect by和level都是为了快 ...

  10. mysql6支持connect by_mysql 实现oracle start with connect by递归

    在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但很遗憾,在MySQL的目前版本中还没有对应的功能. ...

最新文章

  1. 2021研究生报告新鲜出炉!博士每年招生超10万人
  2. Tomcat Server 配置
  3. 小码哥iOS学习笔记第二天: OC对象的分类
  4. 移动端https抓包那些事--初级篇
  5. 0406复利计算5.0--结对
  6. html 窗口页面设置
  7. 欢迎使用Java 8之前要重温的10个JDK 7功能
  8. com+ system application 启动_dubbo启动引导过程(基于2.7.9)
  9. 有了 IP 地址,为什么还要用 MAC 地址?
  10. 计算机图形学实验报告百度云盘,计算机图形学实验报告(一).doc
  11. Halo2 Map Editor Error
  12. 老毛子固件二级路由实现ipv6上网
  13. 这里带你了解IR2104驱动电路
  14. lob移表空间 oracle_关于oracle带lob对象的分区表,移动表空间的问题
  15. html导航栏点击显示该栏内容,点击导航栏,实现下方内容改变
  16. 计算机公式总和,(如何从一年的excel表格数据中知道某项目每月的总和公式)excel两个表格数据匹配...
  17. qcloud.login 登录失败,可能是网络错误或者服务器发生异常的多种解决方法
  18. 数据结构期末考试错点汇总
  19. postgresql -- 绑定变量窥视规则
  20. 分享Linux 机器 CPU 毛刺问题排查经历

热门文章

  1. Win32 文件(2)
  2. 撸了个搜索引擎系统,爽!
  3. 初、中、高级Java工程师有哪些区别?
  4. 数数FastJson那些年犯下的'血案'...
  5. 七年三套房,阿里程序员炫富,努力就有回报,感谢当初的选择!
  6. 2019 年中国互联网企业 100 强揭晓,你的公司排在第几位呢?
  7. 从0开始学习 GitHub 系列之「Git 速成」
  8. tomcat8打开闪退_直接双击启动tomcat中的startup.bat闪退原因及解决方法
  9. 微信小程序wx.navigateTo无法跳转
  10. BIO,NIO,AIO总结