【转】 oracle 层次查询判断叶子和根节点
Oracle 9i判断是叶子或根节点,是比较麻烦的一件事情,SQL演示脚本如下:
- DROP TABLE idb_hierarchical;
- create TABLE idb_hierarchical
- (
- id number,
- parent_id number,
- str varchar2(10)
- );
- insert into idb_hierarchical values(1,null,'A');
- insert into idb_hierarchical values(2,1,'B');
- insert into idb_hierarchical values(3,2,'C');
- insert into idb_hierarchical values(4,3,'D');
- insert into idb_hierarchical values(5,2,'E');
- insert into idb_hierarchical values(6,2,'F');
- insert into idb_hierarchical values(7,3,'G');
- insert into idb_hierarchical values(8,4,'H');
- insert into idb_hierarchical values(9,4,'I');
- insert into idb_hierarchical values(10,null,'J');
- insert into idb_hierarchical values(11,10,'K');
- insert into idb_hierarchical values(12,11,'L');
- insert into idb_hierarchical values(13,10,'M');
- DROP TABLE idb_hierarchical;
- create TABLE idb_hierarchical
- (
- id number,
- parent_id number,
- str varchar2(10)
- );
- insert into idb_hierarchical values(1,null,'A');
- insert into idb_hierarchical values(2,1,'B');
- insert into idb_hierarchical values(3,2,'C');
- insert into idb_hierarchical values(4,3,'D');
- insert into idb_hierarchical values(5,2,'E');
- insert into idb_hierarchical values(6,2,'F');
- insert into idb_hierarchical values(7,3,'G');
- insert into idb_hierarchical values(8,4,'H');
- insert into idb_hierarchical values(9,4,'I');
- insert into idb_hierarchical values(10,null,'J');
- insert into idb_hierarchical values(11,10,'K');
- insert into idb_hierarchical values(12,11,'L');
- insert into idb_hierarchical values(13,10,'M');
示例数据清单如下:
- SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
- FROM idb_hierarchical
- START WITH PARENT_ID IS NULL
- CONNECT BY PARENT_ID = PRIOR ID;
- SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
- FROM idb_hierarchical
- START WITH PARENT_ID IS NULL
- CONNECT BY PARENT_ID = PRIOR ID;
| STR_LEVEL | ID | PARENT_ID | LVL |
|---|---|---|---|
| +..A | 1 | 1 | |
| +….B | 2 | 1 | 2 |
| +……C | 3 | 2 | 3 |
| +……..D | 4 | 3 | 4 |
| +……….H | 8 | 4 | 5 |
| +……….I | 9 | 4 | 5 |
| +……..G | 7 | 3 | 4 |
| +……E | 5 | 2 | 3 |
| +……F | 6 | 2 | 3 |
| +..J | 10 | 1 | |
| +….K | 11 | 10 | 2 |
| +……L | 12 | 11 | 3 |
| +….M | 13 | 10 | 2 |
在表1中,ID为8、9、 7、5、6、12、13都没有子节点,因此称为叶节点。
1.oracle9i 查询叶节点
只显示叶子节点SQL
- SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
- FROM idb_hierarchical I
- --在oracle 9i中显示叶节点,需要判断是否有子节点即可
- WHERE NOT EXISTS(SELECT 1
- FROM idb_hierarchical B
- WHERE I.ID=B.PARENT_ID)
- START WITH PARENT_ID IS NULL
- CONNECT BY PARENT_ID = PRIOR ID;
- SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
- FROM idb_hierarchical I
- --在oracle 9i中显示叶节点,需要判断是否有子节点即可
- WHERE NOT EXISTS(SELECT 1
- FROM idb_hierarchical B
- WHERE I.ID=B.PARENT_ID)
- START WITH PARENT_ID IS NULL
- CONNECT BY PARENT_ID = PRIOR ID;
| STR_LEVEL | ID | PARENT_ID | LVL |
| +……….H | 8 | 4 | 5 |
| +……….I | 9 | 4 | 5 |
| +……..G | 7 | 3 | 4 |
| +……E | 5 | 2 | 3 |
| +……F | 6 | 2 | 3 |
| +……L | 12 | 11 | 3 |
| +….M | 13 | 10 | 2 |
显示所有节点,标明该行是否为叶节点SQL
- SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL,
- NVL((SELECT 'N'
- FROM idb_hierarchical B
- WHERE I.ID=B.PARENT_ID
- AND ROWNUM < 2),'Y') IS_LEAF
- FROM idb_hierarchical I
- START WITH PARENT_ID IS NULL
- CONNECT BY PARENT_ID = PRIOR ID;
- SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL,
- NVL((SELECT 'N'
- FROM idb_hierarchical B
- WHERE I.ID=B.PARENT_ID
- AND ROWNUM < 2),'Y') IS_LEAF
- FROM idb_hierarchical I
- START WITH PARENT_ID IS NULL
- CONNECT BY PARENT_ID = PRIOR ID;
| STR_LEVEL | ID | PARENT_ID | LVL | IS_LEAF |
| +..A | 1 | 1 | N | |
| +....B | 2 | 1 | 2 | N |
| +......C | 3 | 2 | 3 | N |
| +........D | 4 | 3 | 4 | N |
| +..........H | 8 | 4 | 5 | Y |
| +..........I | 9 | 4 | 5 | Y |
| +........G | 7 | 3 | 4 | Y |
| +......E | 5 | 2 | 3 | Y |
| +......F | 6 | 2 | 3 | Y |
| +..J | 10 | 1 | N | |
| +....K | 11 | 10 | 2 | N |
| +......L | 12 | 11 | 3 | Y |
| +....M | 13 | 10 | 2 | Y |
oracle 9i 查询根节点
- SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
- FROM idb_hierarchical I
- START WITH id =2
- CONNECT BY PARENT_ID = PRIOR ID;
- SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
- FROM idb_hierarchical I
- START WITH id =2
- CONNECT BY PARENT_ID = PRIOR ID;
| STR_LEVEL | ID | PARENT_ID | LVL |
| +..B | 2 | 1 | 1 |
| +....C | 3 | 2 | 2 |
| +......D | 4 | 3 | 3 |
| +........H | 8 | 4 | 4 |
| +........I | 9 | 4 | 4 |
| +......G | 7 | 3 | 3 |
| +....E | 5 | 2 | 2 |
| +....F | 6 | 2 | 2 |
根节点ID应该为3、5、6,即lvl为1即可
查询根节点,只显示根节点SQL
- SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
- ID,
- PARENT_ID,
- LEVEL LVL,
- (select b.str
- from idb_hierarchical b
- where level = 1
- start with b.id = 2
- connect by prior b.id = b.parent_id
- ) root_str
- FROM idb_hierarchical I
- where level = 1
- START WITH id = 2
- CONNECT BY PARENT_ID = PRIOR ID;
- SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
- ID,
- PARENT_ID,
- LEVEL LVL,
- (select b.str
- from idb_hierarchical b
- where level = 1
- start with b.id = 2
- connect by prior b.id = b.parent_id
- ) root_str
- FROM idb_hierarchical I
- where level = 1
- START WITH id = 2
- CONNECT BY PARENT_ID = PRIOR ID;
| STR_LEVEL | ID | PARENT_ID | LVL | ROOT_STR |
| +..B | 2 | 1 | 1 | B |
标明根节点SQL
- SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
- ID,
- PARENT_ID,
- DECODE(LEVEL, 1, 'Y', 'N') is_root,
- LEVEL LVL,
- (select b.str
- from idb_hierarchical b
- where level = 1
- start with b.id = 2
- connect by prior b.id = b.parent_id) root_str
- FROM idb_hierarchical I
- START WITH id = 2
- CONNECT BY PARENT_ID = PRIOR ID;
- SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
- ID,
- PARENT_ID,
- DECODE(LEVEL, 1, 'Y', 'N') is_root,
- LEVEL LVL,
- (select b.str
- from idb_hierarchical b
- where level = 1
- start with b.id = 2
- connect by prior b.id = b.parent_id) root_str
- FROM idb_hierarchical I
- START WITH id = 2
- CONNECT BY PARENT_ID = PRIOR ID;
| STR_LEVEL | ID | PARENT_ID | IS_ROOT | LVL | ROOT_STR |
| +..B | 2 | 1 | Y | 1 | B |
| +....C | 3 | 2 | N | 2 | B |
| +......D | 4 | 3 | N | 3 | B |
| +........H | 8 | 4 | N | 4 | B |
| +........I | 9 | 4 | N | 4 | B |
| +......G | 7 | 3 | N | 3 | B |
| +....E | 5 | 2 | N | 2 | B |
| +....F | 6 | 2 | N | 2 | B |
在oracle 10g提供了connect_by_isleaf和connect_by_root
oracle 10g用connect_by_isleaf判断叶节点
- SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
- FROM idb_hierarchical I
- where connect_by_isleaf=1
- START WITH PARENT_ID IS NULL
- CONNECT BY PARENT_ID = PRIOR ID;
- SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
- FROM idb_hierarchical I
- where connect_by_isleaf=1
- START WITH PARENT_ID IS NULL
- CONNECT BY PARENT_ID = PRIOR ID;
| STR_LEVEL | ID | PARENT_ID | LVL |
| +..........H | 8 | 4 | 5 |
| +..........I | 9 | 4 | 5 |
| +........G | 7 | 3 | 4 |
| +......E | 5 | 2 | 3 |
| +......F | 6 | 2 | 3 |
| +......L | 12 | 11 | 3 |
| +....M | 13 | 10 | 2 |
- SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL,
- decode(connect_by_isleaf,1,'Y','N') IS_LEAF
- FROM idb_hierarchical I
- START WITH PARENT_ID IS NULL
- CONNECT BY PARENT_ID = PRIOR ID;
- SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL,
- decode(connect_by_isleaf,1,'Y','N') IS_LEAF
- FROM idb_hierarchical I
- START WITH PARENT_ID IS NULL
- CONNECT BY PARENT_ID = PRIOR ID;
| STR_LEVEL | ID | PARENT_ID | LVL | IS_LEAF |
| +..A | 1 | 1 | N | |
| +....B | 2 | 1 | 2 | N |
| +......C | 3 | 2 | 3 | N |
| +........D | 4 | 3 | 4 | N |
| +..........H | 8 | 4 | 5 | Y |
| +..........I | 9 | 4 | 5 | Y |
| +........G | 7 | 3 | 4 | Y |
| +......E | 5 | 2 | 3 | Y |
| +......F | 6 | 2 | 3 | Y |
| +..J | 10 | 1 | N | |
| +....K | 11 | 10 | 2 | N |
| +......L | 12 | 11 | 3 | Y |
| +....M | 13 | 10 | 2 | Y |
oracle 10g用connect_by_root判断根节点
- SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
- ID,
- PARENT_ID,
- LEVEL LVL,
- connect_by_root STR ROOT_STR
- FROM idb_hierarchical I
- START WITH id = 2
- CONNECT BY PARENT_ID = PRIOR ID;
- SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
- ID,
- PARENT_ID,
- LEVEL LVL,
- connect_by_root STR ROOT_STR
- FROM idb_hierarchical I
- START WITH id = 2
- CONNECT BY PARENT_ID = PRIOR ID;
| STR_LEVEL | ID | PARENT_ID | LVL | ROOT_STR |
|---|---|---|---|---|
| +..B | 2 | 1 | 1 | B |
| +....C | 3 | 2 | 2 | B |
| +......D | 4 | 3 | 3 | B |
| +........H | 8 | 4 | 4 | B |
| +........I | 9 | 4 | 4 | B |
| +......G | 7 | 3 | 3 | B |
| +....E | 5 | 2 | 2 | B |
| +....F | 6 | 2 | 2 | B |
- SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
- ID,
- PARENT_ID,
- DECODE(LEVEL, 1, 'Y', 'N') is_root,
- LEVEL LVL,
- connect_by_root STR ROOT_STR
- FROM idb_hierarchical I
- START WITH id = 3
- CONNECT BY PARENT_ID = PRIOR ID;
- SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
- ID,
- PARENT_ID,
- DECODE(LEVEL, 1, 'Y', 'N') is_root,
- LEVEL LVL,
- connect_by_root STR ROOT_STR
- FROM idb_hierarchical I
- START WITH id = 3
- CONNECT BY PARENT_ID = PRIOR ID;
| STR_LEVEL | ID | PARENT_ID | IS_ROOT | LVL | ROOT_STR |
|---|---|---|---|---|---|
| +..C | 3 | 2 | Y | 1 | C |
| +....D | 4 | 3 | N | 2 | C |
| +......H | 8 | 4 | N | 3 | C |
| +......I | 9 | 4 | N | 3 | C |
| +....G | 7 | 3 | N | 2 | C |
- SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
- ID,
- PARENT_ID,
- DECODE(LEVEL, 1, 'Y', 'N') is_root,
- LEVEL LVL,
- connect_by_root STR ROOT_STR
- FROM idb_hierarchical I
- START WITH PARENT_ID = 2
- CONNECT BY PARENT_ID = PRIOR ID;
- SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
- ID,
- PARENT_ID,
- DECODE(LEVEL, 1, 'Y', 'N') is_root,
- LEVEL LVL,
- connect_by_root STR ROOT_STR
- FROM idb_hierarchical I
- START WITH PARENT_ID = 2
- CONNECT BY PARENT_ID = PRIOR ID;
| STR_LEVEL | ID | PARENT_ID | IS_ROOT | LVL | ROOT_STR |
|---|---|---|---|---|---|
| +..C | 3 | 2 | Y | 1 | C |
| +....D | 4 | 3 | N | 2 | C |
| +......H | 8 | 4 | N | 3 | C |
| +......I | 9 | 4 | N | 3 | C |
| +....G | 7 | 3 | N | 2 | C |
| +..E | 5 | 2 | Y | 1 | E |
| +..F | 6 | 2 | Y | 1 | F |
【转】 oracle 层次查询判断叶子和根节点的更多相关文章
- Oracle 层次查询 connect by
oracle 层次查询 语法: SELECT ... FROM [WHERE condition] --过 ...
- 带您了解Oracle层次查询
http://database.51cto.com/art/201010/231539.htm Oracle层次查询(connect by )是结构化查询中用到的,下面就为您介绍Oracle层次查询的 ...
- Oracle层次查询
Oracle层次查询的语法如下: 下面根据两道“烧脑”的题具体来体现: 1. 根据时间先后顺序,十二星座的英文名称用逗号串起来为'Aries,Taurus,Gemini,Cancer,Leo,Virg ...
- Oracle - 层次查询
如果表中含有层次数据,可以通过使用层次查询有序地查看层次数据. 语法: condition:指一个或多个表达式和逻辑(布尔)运算符的组合,并返回TRUE.FALSE或UNKNOWNstart with ...
- Oracle层次查询start with connect by
博客参考:https://www.cnblogs.com/jerryxing/articles/2339352.html start with connect by 层次查询(Hierarchical ...
- 【转载】Oracle层次查询和分析函数
摘要 一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的数?知道一个大的号段范围和已经取过的号段,如何求出可用的号段?利用Oracle提供的强大的查 ...
- Oracle层次查询和分析函数在号段选取中的应用
转自:http://www.itpub.net/thread-719692-1-1.html 摘要一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的 ...
- oracle层次查询的陷阱
今天开发组同事找到我,说一个简单的层次查询非常慢,业务就是有一个存设备表连接关系的表,从node1连入,从node2连出,现在要找出node2的连出顺序,sql类似于: SELECT LEVEL ID ...
- Oracle层次查询和with函数的使用
开发中大家应该都做过什么类似部门管理这样的功能,一般情况下一个部门下面还有下一级部门(子部门),这个层级就类似一棵树.这种情况下一般会把父级部门和子级部门分成2个或者多个表,这种算是比较常规的做法:有 ...
随机推荐
- 基于matplotlib的数据可视化 -
matplotlib.pyplot(as mp or as plt)提供基于python语言的绘图函数 引用方式: import matplotlib.pyplot as mp / as plt 本章 ...
- java单双派机制理解
引言:Java是一个支持双分派的单分派语言 知道java是支持后期动态绑定,也知道访问者模式,但是两者之间的关系,还真不知道,况且在这之间还有一个静态绑定. 1.动态绑定 class Father { ...
- spring 定时任务执行两次解决办法
在web.xml中同时配置了ContextLoaderListener和DispatcherServlet?假如真是这样的话,需要删掉一个配置,因为你相当于配置了两个spring容器,两个容器分别都执 ...
- 输出当前MySQL的环境变量:
输出当前mysql的环境变量: > MySQL.exe --help >output.txt
- nginx / apache / tomcat /resin等 http server的benchmark性能测试方法
性能测试是软件产品发布前必经阶段,对于web app的发布需要使用http server,可选择的优秀免费http server主要有开源apache server, 俄国的nginx,专用于java ...
- Asp.net(C#)常用正则表达式封装
using System; using System.Collections; using System.Text.RegularExpressions; namespace MSCL { //// ...
- java和js实现电话号码部分隐藏
有时候我们不需要将电话号码全部展现在页面上,那么我们可能要对电话号码进行相应的处理,js代码如下: alert("13456789012".replace(/(\d{3})(\d{ ...
- java Web的MVC最基础暂定分层包
数据封装 entity, 数据访问对象 Dao, 业务逻辑 servlet, ----- 网页显示层 jsp 加上 jsp附带技术 el表达式和jstl ,jsp 标记库语言, el表达式 ${us ...
- kail linux 系统下利用metaspolit工具渗透win7电脑
注:只是测试,不可干违法的事. 一.metaspolit工具的介绍 1.1.metaspolit 是一款开源安全漏洞检测工具,附带数百个已知的软件漏洞,并保持频繁更新.被安全社区冠以“可以黑掉整个宇 ...
- memcached(一):linux下memcached安装以及启动
一. 安装文件 Linux系统安装memcached,首先要先安装libevent库. 下载memcached与libevent的安装文件 http://memcached.org/files/mem ...