Oracle 9i判断是叶子或根节点,是比较麻烦的一件事情,SQL演示脚本如下:

  1. DROP TABLE idb_hierarchical;
  2. create TABLE idb_hierarchical
  3. (
  4. id number,
  5. parent_id number,
  6. str varchar2(10)
  7. );
  8. insert into idb_hierarchical values(1,null,'A');
  9. insert into idb_hierarchical values(2,1,'B');
  10. insert into idb_hierarchical values(3,2,'C');
  11. insert into idb_hierarchical values(4,3,'D');
  12. insert into idb_hierarchical values(5,2,'E');
  13. insert into idb_hierarchical values(6,2,'F');
  14. insert into idb_hierarchical values(7,3,'G');
  15. insert into idb_hierarchical values(8,4,'H');
  16. insert into idb_hierarchical values(9,4,'I');
  17. insert into idb_hierarchical values(10,null,'J');
  18. insert into idb_hierarchical values(11,10,'K');
  19. insert into idb_hierarchical values(12,11,'L');
  20. insert into idb_hierarchical values(13,10,'M');
  1. DROP TABLE idb_hierarchical;
  2. create TABLE idb_hierarchical
  3. (
  4. id number,
  5. parent_id number,
  6. str varchar2(10)
  7. );
  8. insert into idb_hierarchical values(1,null,'A');
  9. insert into idb_hierarchical values(2,1,'B');
  10. insert into idb_hierarchical values(3,2,'C');
  11. insert into idb_hierarchical values(4,3,'D');
  12. insert into idb_hierarchical values(5,2,'E');
  13. insert into idb_hierarchical values(6,2,'F');
  14. insert into idb_hierarchical values(7,3,'G');
  15. insert into idb_hierarchical values(8,4,'H');
  16. insert into idb_hierarchical values(9,4,'I');
  17. insert into idb_hierarchical values(10,null,'J');
  18. insert into idb_hierarchical values(11,10,'K');
  19. insert into idb_hierarchical values(12,11,'L');
  20. insert into idb_hierarchical values(13,10,'M');

示例数据清单如下:

  1. SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
  2. FROM idb_hierarchical
  3. START WITH PARENT_ID IS NULL
  4. CONNECT BY PARENT_ID = PRIOR ID;
  1. SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
  2. FROM idb_hierarchical
  3. START WITH PARENT_ID IS NULL
  4. 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

  1. SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
  2. FROM idb_hierarchical I
  3. --在oracle 9i中显示叶节点,需要判断是否有子节点即可
  4. WHERE NOT EXISTS(SELECT 1
  5. FROM idb_hierarchical B
  6. WHERE I.ID=B.PARENT_ID)
  7. START WITH PARENT_ID IS NULL
  8. CONNECT BY PARENT_ID = PRIOR ID;
  1. SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
  2. FROM idb_hierarchical I
  3. --在oracle 9i中显示叶节点,需要判断是否有子节点即可
  4. WHERE NOT EXISTS(SELECT 1
  5. FROM idb_hierarchical B
  6. WHERE I.ID=B.PARENT_ID)
  7. START WITH PARENT_ID IS NULL
  8. 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

  1. SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL,
  2. NVL((SELECT 'N'
  3. FROM idb_hierarchical B
  4. WHERE I.ID=B.PARENT_ID
  5. AND ROWNUM  < 2),'Y') IS_LEAF
  6. FROM idb_hierarchical I
  7. START WITH PARENT_ID IS NULL
  8. CONNECT BY PARENT_ID = PRIOR ID;
  1. SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL,
  2. NVL((SELECT 'N'
  3. FROM idb_hierarchical B
  4. WHERE I.ID=B.PARENT_ID
  5. AND ROWNUM  < 2),'Y') IS_LEAF
  6. FROM idb_hierarchical I
  7. START WITH PARENT_ID IS NULL
  8. 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 查询根节点

  1. SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
  2. FROM idb_hierarchical I
  3. START WITH id =2
  4. CONNECT BY PARENT_ID = PRIOR ID;
  1. SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
  2. FROM idb_hierarchical I
  3. START WITH id =2
  4. 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

  1. SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. LEVEL LVL,
  5. (select b.str
  6. from idb_hierarchical b
  7. where level = 1
  8. start with b.id = 2
  9. connect by prior b.id =  b.parent_id
  10. ) root_str
  11. FROM idb_hierarchical I
  12. where level = 1
  13. START WITH id = 2
  14. CONNECT BY PARENT_ID = PRIOR ID;
  1. SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. LEVEL LVL,
  5. (select b.str
  6. from idb_hierarchical b
  7. where level = 1
  8. start with b.id = 2
  9. connect by prior b.id =  b.parent_id
  10. ) root_str
  11. FROM idb_hierarchical I
  12. where level = 1
  13. START WITH id = 2
  14. CONNECT BY PARENT_ID = PRIOR ID;
表5
STR_LEVEL ID PARENT_ID LVL ROOT_STR
+..B 2 1 1 B

标明根节点SQL

  1. SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. DECODE(LEVEL, 1, 'Y', 'N') is_root,
  5. LEVEL LVL,
  6. (select b.str
  7. from idb_hierarchical b
  8. where level = 1
  9. start with b.id = 2
  10. connect by prior b.id = b.parent_id) root_str
  11. FROM idb_hierarchical I
  12. START WITH id = 2
  13. CONNECT BY PARENT_ID = PRIOR ID;
  1. SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. DECODE(LEVEL, 1, 'Y', 'N') is_root,
  5. LEVEL LVL,
  6. (select b.str
  7. from idb_hierarchical b
  8. where level = 1
  9. start with b.id = 2
  10. connect by prior b.id = b.parent_id) root_str
  11. FROM idb_hierarchical I
  12. START WITH id = 2
  13. 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判断叶节点

  1. SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
  2. FROM idb_hierarchical I
  3. where connect_by_isleaf=1
  4. START WITH PARENT_ID IS NULL
  5. CONNECT BY PARENT_ID = PRIOR ID;
  1. SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
  2. FROM idb_hierarchical I
  3. where connect_by_isleaf=1
  4. START WITH PARENT_ID IS NULL
  5. 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
  1. SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL,
  2. decode(connect_by_isleaf,1,'Y','N') IS_LEAF
  3. FROM idb_hierarchical I
  4. START WITH PARENT_ID IS NULL
  5. CONNECT BY PARENT_ID = PRIOR ID;
  1. SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL,
  2. decode(connect_by_isleaf,1,'Y','N') IS_LEAF
  3. FROM idb_hierarchical I
  4. START WITH PARENT_ID IS NULL
  5. 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判断根节点

  1. SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. LEVEL LVL,
  5. connect_by_root STR ROOT_STR
  6. FROM idb_hierarchical I
  7. START WITH id = 2
  8. CONNECT BY PARENT_ID = PRIOR ID;
  1. SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. LEVEL LVL,
  5. connect_by_root STR ROOT_STR
  6. FROM idb_hierarchical I
  7. START WITH id = 2
  8. 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
  1. SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. DECODE(LEVEL, 1, 'Y', 'N') is_root,
  5. LEVEL LVL,
  6. connect_by_root STR ROOT_STR
  7. FROM idb_hierarchical I
  8. START WITH id = 3
  9. CONNECT BY PARENT_ID = PRIOR ID;
  1. SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. DECODE(LEVEL, 1, 'Y', 'N') is_root,
  5. LEVEL LVL,
  6. connect_by_root STR ROOT_STR
  7. FROM idb_hierarchical I
  8. START WITH id = 3
  9. 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
  1. SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. DECODE(LEVEL, 1, 'Y', 'N') is_root,
  5. LEVEL LVL,
  6. connect_by_root STR ROOT_STR
  7. FROM idb_hierarchical I
  8. START WITH PARENT_ID = 2
  9. CONNECT BY PARENT_ID = PRIOR ID;
  1. SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. DECODE(LEVEL, 1, 'Y', 'N') is_root,
  5. LEVEL LVL,
  6. connect_by_root STR ROOT_STR
  7. FROM idb_hierarchical I
  8. START WITH PARENT_ID = 2
  9. 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 层次查询 connect by

      oracle 层次查询 语法:       SELECT ... FROM            [WHERE condition]                             --过 ...

  2. 带您了解Oracle层次查询

    http://database.51cto.com/art/201010/231539.htm Oracle层次查询(connect by )是结构化查询中用到的,下面就为您介绍Oracle层次查询的 ...

  3. Oracle层次查询

    Oracle层次查询的语法如下: 下面根据两道“烧脑”的题具体来体现: 1. 根据时间先后顺序,十二星座的英文名称用逗号串起来为'Aries,Taurus,Gemini,Cancer,Leo,Virg ...

  4. Oracle - 层次查询

    如果表中含有层次数据,可以通过使用层次查询有序地查看层次数据. 语法: condition:指一个或多个表达式和逻辑(布尔)运算符的组合,并返回TRUE.FALSE或UNKNOWNstart with ...

  5. Oracle层次查询start with connect by

    博客参考:https://www.cnblogs.com/jerryxing/articles/2339352.html start with connect by 层次查询(Hierarchical ...

  6. 【转载】Oracle层次查询和分析函数

    摘要 一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的数?知道一个大的号段范围和已经取过的号段,如何求出可用的号段?利用Oracle提供的强大的查 ...

  7. Oracle层次查询和分析函数在号段选取中的应用

    转自:http://www.itpub.net/thread-719692-1-1.html 摘要一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的 ...

  8. oracle层次查询的陷阱

    今天开发组同事找到我,说一个简单的层次查询非常慢,业务就是有一个存设备表连接关系的表,从node1连入,从node2连出,现在要找出node2的连出顺序,sql类似于: SELECT LEVEL ID ...

  9. Oracle层次查询和with函数的使用

    开发中大家应该都做过什么类似部门管理这样的功能,一般情况下一个部门下面还有下一级部门(子部门),这个层级就类似一棵树.这种情况下一般会把父级部门和子级部门分成2个或者多个表,这种算是比较常规的做法:有 ...

随机推荐

  1. WAMP 默认mysql密码修改

    WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入密码,因为现在是空,所以直接按回车 ...

  2. 一步一步掌握java的线程机制(二)----Thread的生命周期

    之前讲到Thread的创建,那是Thread生命周期的第一步,其后就是通过start()方法来启动Thread,它会执行一些内部的管理工作然后调用Thread的run()方法,此时该Thread就是a ...

  3. C++的字符串格式化库

    这里向大家介绍一个C++的字符串格式化库,叫cpptempl,这个库支持对字符串格式的条件,循环,变量插入.看上去很不错,只不过其是基于boost库的. 下面是一个例子: 1 2 3 4 5 6 7 ...

  4. API设计原则

    译序 Qt的设计水准在业界很有口碑,一致.易于掌握和强大的API是Qt最著名的优点之一.此文既是Qt官网上的API设计指导准则,也是Qt在API设计上的实践总结.虽然Qt用的是C++,但其中设计原则和 ...

  5. [转] spring的普通类中如何取session和request对像

    在使用spring时,经常需要在普通类中获取session,request等对像.比如一些AOP拦截器类,在有使用struts2时,因为struts2有一个接口使用org.apache.struts2 ...

  6. 亿级Web系统搭建:单机到分布式集群【转】

    当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...

  7. Quartz 任务调度框架之Hello World

    0x01 什么是Quartz? Quartz是一个完全由java编写的开源作业调度框架. 0x02 实战Quartz Hello World 创建Maven项目,POM 文件配置如下: <pro ...

  8. Atitit 架构的原则attilax总结

    Atitit 架构的原则attilax总结 1.1. Rule of three称为"三次原则",指的是当某个功能第三次出现时,才进行"抽象化".是DRY原则和 ...

  9. 含有按钮的ScrollView在iOS8中无法滚动的解决办法 | ScrollView with UIControl/UIButton subviews not scrollable under iOS 8

    转自:http://zcw.me/blogwp/%E5%90%AB%E6%9C%89%E6%8C%89%E9%92%AE%E7%9A%84scrollview%E5%9C%A8ios8%E4%B8%A ...

  10. android源码上面开发App

    使用eclipse 打开源码:http://blog.csdn.net/androidlover1991/article/details/17011991 使用android studio 打开源码h ...