Oracle.start with … connect by [… and] prior…order siblings by …
在整個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 …相关推荐
- Oracle start with connect by prior 使用总结
目录 定义 举个栗子 第一种情况 第二种情况 第三种情况 第四种情况 总结 定义 start with: 指定起始节点的条件,可以放父级条件,也可以放子级条件 connect by: 连接条件 pri ...
- Oracle递归查询,Oracle START WITH……CONNECT BY查询
Oracle递归查询,Oracle START WITH--CONNECT BY查询,Oracle树查询 ================================ ©Copyright 蕃薯耀 ...
- oracle 层次查询 connect by
Hierarchical Queries 语法 connect by [nocycle] condition [start with condition] start with condition c ...
- oracle树结构查询----connect by语法详解
connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start with 条件1 connect by 条件2 where 条件3; 例: ...
- oracle until freed,Oracle中报错Connect internal only, until freed
Oracle中报错Connect internal only, until freed属于归档日志满了. 有两种方法可以解决,第一种是删除归档日志,第二种是增大闪回日志文件的最大大小 SQL> ...
- Oracle start with.connect by prior子句实现递归查询
Oracle中的select语句可以用start with...connect by prior子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: select ... fr ...
- 在oracle中通过connect by prior来实现递归查询!
connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start by cond1 connect by cond2 where cond3; ...
- Oracle START WITH ... CONNECT BY PRIOR 带条件会有重复
2019独角兽企业重金招聘Python工程师标准>>> 解决方案:http://blog.csdn.net/zy_crazy_code/article/details/5240332 ...
- oracle 数据库中 connect by 和level 的用法
这几天看sql看到了有关connect by和level的关键字用法,以前都用mysql也没用过这个关键字,感觉挺有用的,就学了下,整理一下学习过程. 首先,connect by和level都是为了快 ...
- mysql6支持connect by_mysql 实现oracle start with connect by递归
在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但很遗憾,在MySQL的目前版本中还没有对应的功能. ...
最新文章
- 2021研究生报告新鲜出炉!博士每年招生超10万人
- Tomcat Server 配置
- 小码哥iOS学习笔记第二天: OC对象的分类
- 移动端https抓包那些事--初级篇
- 0406复利计算5.0--结对
- html 窗口页面设置
- 欢迎使用Java 8之前要重温的10个JDK 7功能
- com+ system application 启动_dubbo启动引导过程(基于2.7.9)
- 有了 IP 地址,为什么还要用 MAC 地址?
- 计算机图形学实验报告百度云盘,计算机图形学实验报告(一).doc
- Halo2 Map Editor Error
- 老毛子固件二级路由实现ipv6上网
- 这里带你了解IR2104驱动电路
- lob移表空间 oracle_关于oracle带lob对象的分区表,移动表空间的问题
- html导航栏点击显示该栏内容,点击导航栏,实现下方内容改变
- 计算机公式总和,(如何从一年的excel表格数据中知道某项目每月的总和公式)excel两个表格数据匹配...
- qcloud.login 登录失败,可能是网络错误或者服务器发生异常的多种解决方法
- 数据结构期末考试错点汇总
- postgresql -- 绑定变量窥视规则
- 分享Linux 机器 CPU 毛刺问题排查经历
热门文章
- Win32 文件(2)
- 撸了个搜索引擎系统,爽!
- 初、中、高级Java工程师有哪些区别?
- 数数FastJson那些年犯下的'血案'...
- 七年三套房,阿里程序员炫富,努力就有回报,感谢当初的选择!
- 2019 年中国互联网企业 100 强揭晓,你的公司排在第几位呢?
- 从0开始学习 GitHub 系列之「Git 速成」
- tomcat8打开闪退_直接双击启动tomcat中的startup.bat闪退原因及解决方法
- 微信小程序wx.navigateTo无法跳转
- BIO,NIO,AIO总结