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');
[sql] view plaincopy
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');
示例数据清单如下: view plaincopy to clipboardprint?
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;
表1:数据清单
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 view plaincopy to clipboardprint?
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;
[sql] view plaincopy
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;
表2
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 view plaincopy to clipboardprint?
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;
[sql] view plaincopy
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;
表3
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 查询根节点
view plaincopy to clipboardprint?
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;
[sql] view plaincopy
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;
表4
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 view plaincopy to clipboardprint?
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;
[sql] view plaincopy
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;
表5
STR_LEVEL ID PARENT_ID LVL ROOT_STR
+..B 2 1 1 B
标明根节点SQL view plaincopy to clipboardprint?
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;
[sql] view plaincopy
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;
表6
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判断叶节点
view plaincopy to clipboardprint?
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;
[sql] view plaincopy
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;
表7
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
view plaincopy to clipboardprint?
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;
[sql] view plaincopy
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;
表8
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判断根节点
view plaincopy to clipboardprint?
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;
[sql] view plaincopy
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;
表9
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
view plaincopy to clipboardprint?
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;
[sql] view plaincopy
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;
表10
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
view plaincopy to clipboardprint?
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;
[sql] view plaincopy
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;
表11
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查询树形数据的叶节点和子节点的更多相关文章

  1. ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法

    ORACLE 查询一个数据表后通过遍历再插入另一个表中的两种写法 语法 第一种: 通过使用Oracle语句块  --指定文档所有部门都能查看 declare cursor TABLE_DEPT and ...

  2. oracle 查询本周数据生成下周数据

      CreateTime--2018年1月4日16:38:01 Author:Marydon oracle 查询本周数据生成下周数据 第一步:查询指定区间数据 第二步:改变查询结果的值 查询日期字段+ ...

  3. SqlServer父节点与子节点查询及递归

    在最近老是用到这个SQL,所以记下来了: 1:创建表 CREATE TABLE [dbo].[BD_Booklet]( [ObjID] [int] IDENTITY(1,1) NOT NULL, [P ...

  4. Web网页树形列表中实现选中父节点则子节点全选和不选中父则子全不选

                需要实现的功能:选中父节点对应子节点全选:不选中父节点,对应子节点也不选中 如下图所示,选中车队,对应车队中车辆也全部选中,以实现车队中所有车辆在地图上的显示. 选中cqupt ...

  5. zTree实现清空选中的第一个节点的子节点

    zTree实现清空选中的第一个节点的子节点 1.实现源代码 <!DOCTYPE html> <html> <head> <title>zTree实现基本 ...

  6. 总结获取原生JS(javascript)的父节点、子节点、兄弟节点

    关于原生JS获取节点,一直是个头疼的问题,而且调用方法的名字又贼长了,所以我选择用JQ,好像跑题了-- 话不多说看代码 获取父节点 及 父节点下所有子节点(兄弟节点) <ul> <l ...

  7. C#中treeview的问题,如何区分根节点和子节点以及根节点和根节点的兄弟节点?

    根节点的Level属性为0,一级子节点Level属性为1,二级子节点Level属性为2,以此类推:同级节点可以用索引.名称.文本来区分.用索引区分根节点时,TreeView.Nodes[0]就是第一个 ...

  8. JavaScript的DOM编程--04--获取元素节点的子节点

    获取元素节点的子节点(**只有元素节点才有子节点!!) 1). childNodes 属性获取全部的子节点, 但该方法不实用. 因为如果要获取指定的节点 的指定子节点的集合, 可以直接调用元素节点的 ...

  9. jQuery获取节点和子节点文本的方法

    本节主要介绍了jQuery如何获取节点和子节点文本,下面有个示例,大家可以参考下 对于下面的html片段, ? 1 <div id="text_test">test t ...

随机推荐

  1. ASP.NET中的母版页

    添加一个"母版页",使用<asp:ContentPlaceHolder>挖坑,新建的母版页已经自动设置了两个ContentPlaceHolder创建使用母版页的具体页面 ...

  2. 微软AJAX解决方案

    -------- 微软AJAX解决方案 (*) --------ASP.Net中内置的简化AJAX开发的控件UpdatePanel 放入ScriptManager,将要实现AJAX效果的控件放到Upd ...

  3. 设计模式之开篇(C#语法)

    很长时间没有写文章了,前段时间写的C#语法糖分享得到有很多朋友支持,这个也使得我有信心继续分享下去,在这里非常感谢大家!这次开始给大家分享一下设计模式,我个人觉得设计模式也对于我们提高个人技术水平来说 ...

  4. django 学习点滴

    django连接数据库要安装第三方包,比如mysql的就是 python-mysqldb, 用apt-cache search python-mysql 搜索一下. django的project可以放 ...

  5. js获取json数据

    var json = {  contry:{ area:{ man:"12万",  women:"10万" } } };//方式一:使用eval解析  var  ...

  6. php中引用符号(&amp;)的使用详解

    php的引用就是在变量或者函数.对象等前面加上&符号,在PHP 中引用的意思是:不同的名字访问同一个变量内容,下面介绍如何使用PHP的引用 与C语言中的指针是有差别的.C语言中的指针里面存储的 ...

  7. 韦东山教程ARM的时钟设置出现的问题及其解决方法

    时钟设置是一个非常重要的环节,如果系统没有合适的时钟,根本无法工作.   S3C2440的时钟复杂,分为FCLK,HCLK,PCLK.    在程序测试中,曾出现这样一个错误.系统当前FCLK为400 ...

  8. ARM编译器4字节对齐

    (1)我们假设只有一个赋初值的char型全局变量,那么系统会在data区分配一个4字节的存储空间来存储它.实际上,只用了1个字节,但是为了4字节对齐,只好分配4个字节,所以就会有3个字节浪费. (2) ...

  9. Ubuntu下Memcache的安装与基本使用

    安装Memcache Memcache分为两部分,Memcache服务端和客户端.Memcache服务端是作为服务来运行的,所有数据缓存的建立,存储,删除实际上都是在这里完成的.客户端,在这里我们指的 ...

  10. Word添加新编号

    要用到(1)(2),不想手写,但是word只有1.2.3和1)2)3),我就自定义哦.