首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

oracle 层次查询判断叶片和根节点

2012-12-31 
oracle 层次查询判断叶子和根节点oracle 9i判断是叶子或根节点,是比较麻烦的一件事情,SQL演示脚本如下:vie

oracle 层次查询判断叶子和根节点

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

??? 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;?

[sql] view plaincopy

??? 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

?

?

转载:

http://blog.csdn.net/zhangdaiscott/article/details/6721313

热点排行