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

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

  1. DROPTABLEidb_hierarchical;
  2. createTABLEidb_hierarchical
  3. (
  4. idnumber,
  5. parent_idnumber,
  6. strvarchar2(10)
  7. );
  8. insertintoidb_hierarchicalvalues(1,null,'A');
  9. insertintoidb_hierarchicalvalues(2,1,'B');
  10. insertintoidb_hierarchicalvalues(3,2,'C');
  11. insertintoidb_hierarchicalvalues(4,3,'D');
  12. insertintoidb_hierarchicalvalues(5,2,'E');
  13. insertintoidb_hierarchicalvalues(6,2,'F');
  14. insertintoidb_hierarchicalvalues(7,3,'G');
  15. insertintoidb_hierarchicalvalues(8,4,'H');
  16. insertintoidb_hierarchicalvalues(9,4,'I');
  17. insertintoidb_hierarchicalvalues(10,null,'J');
  18. insertintoidb_hierarchicalvalues(11,10,'K');
  19. insertintoidb_hierarchicalvalues(12,11,'L');
  20. insertintoidb_hierarchicalvalues(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');

示例数据清单如下:

  1. SELECTRPAD('+',LEVEL*2+1,'.')||STRSTR_LEVEL,ID,PARENT_ID,LEVELLVL
  2. FROMidb_hierarchical
  3. STARTWITHPARENT_IDISNULL
  4. CONNECTBYPARENT_ID=PRIORID;
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_LEVELIDPARENT_IDLVL
+..A11
+….B212
+……C323
+……..D434
+……….H845
+……….I945
+……..G734
+……E523
+……F623
+..J101
+….K11102
+……L12113
+….M13102

在表1中,ID为8、9、 7、5、6、12、13都没有子节点,因此称为叶节点。

1.oracle9i 查询叶节点

只显示叶子节点SQL

  1. SELECTRPAD('+',LEVEL*2+1,'.')||STRSTR_LEVEL,ID,PARENT_ID,LEVELLVL
  2. FROMidb_hierarchicalI
  3. --在oracle9i中显示叶节点,需要判断是否有子节点即可
  4. WHERENOTEXISTS(SELECT1
  5. FROMidb_hierarchicalB
  6. WHEREI.ID=B.PARENT_ID)
  7. STARTWITHPARENT_IDISNULL
  8. CONNECTBYPARENT_ID=PRIORID;
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_LEVELIDPARENT_IDLVL
+……….H845
+……….I945
+……..G734
+……E523
+……F623
+……L12113
+….M13102

显示所有节点,标明该行是否为叶节点SQL

  1. SELECTRPAD('+',LEVEL*2+1,'.')||STRSTR_LEVEL,ID,PARENT_ID,LEVELLVL,
  2. NVL((SELECT'N'
  3. FROMidb_hierarchicalB
  4. WHEREI.ID=B.PARENT_ID
  5. ANDROWNUM<2),'Y')IS_LEAF
  6. FROMidb_hierarchicalI
  7. STARTWITHPARENT_IDISNULL
  8. CONNECTBYPARENT_ID=PRIORID;
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_LEVELIDPARENT_IDLVLIS_LEAF
+..A11N
+....B212N
+......C323N
+........D434N
+..........H845Y
+..........I945Y
+........G734Y
+......E523Y
+......F623Y
+..J101N
+....K11102N
+......L12113Y
+....M13102Y
oracle 9i 查询根节点
  1. SELECTRPAD('+',LEVEL*2+1,'.')||STRSTR_LEVEL,ID,PARENT_ID,LEVELLVL
  2. FROMidb_hierarchicalI
  3. STARTWITHid=2
  4. CONNECTBYPARENT_ID=PRIORID;
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_LEVELIDPARENT_IDLVL
+..B211
+....C322
+......D433
+........H844
+........I944
+......G733
+....E522
+....F622

根节点ID应该为3、5、6,即lvl为1即可

查询根节点,只显示根节点SQL

  1. SELECTRPAD('+',LEVEL*2+1,'.')||STRSTR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. LEVELLVL,
  5. (selectb.str
  6. fromidb_hierarchicalb
  7. wherelevel=1
  8. startwithb.id=2
  9. connectbypriorb.id=b.parent_id
  10. )root_str
  11. FROMidb_hierarchicalI
  12. wherelevel=1
  13. STARTWITHid=2
  14. CONNECTBYPARENT_ID=PRIORID;
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_LEVELIDPARENT_IDLVLROOT_STR
+..B211B

标明根节点SQL

  1. SELECTRPAD('+',LEVEL*2+1,'.')||STRSTR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. DECODE(LEVEL,1,'Y','N')is_root,
  5. LEVELLVL,
  6. (selectb.str
  7. fromidb_hierarchicalb
  8. wherelevel=1
  9. startwithb.id=2
  10. connectbypriorb.id=b.parent_id)root_str
  11. FROMidb_hierarchicalI
  12. STARTWITHid=2
  13. CONNECTBYPARENT_ID=PRIORID;
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_LEVELIDPARENT_IDIS_ROOTLVLROOT_STR
+..B21Y1B
+....C32N2B
+......D43N3B
+........H84N4B
+........I94N4B
+......G73N3B
+....E52N2B
+....F62N2B

在oracle 10g提供了connect_by_isleaf和connect_by_root

oracle 10g用connect_by_isleaf判断叶节点
  1. SELECTRPAD('+',LEVEL*2+1,'.')||STRSTR_LEVEL,ID,PARENT_ID,LEVELLVL
  2. FROMidb_hierarchicalI
  3. whereconnect_by_isleaf=1
  4. STARTWITHPARENT_IDISNULL
  5. CONNECTBYPARENT_ID=PRIORID;
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_LEVELIDPARENT_IDLVL
+..........H845
+..........I945
+........G734
+......E523
+......F623
+......L12113
+....M13102
  1. SELECTRPAD('+',LEVEL*2+1,'.')||STRSTR_LEVEL,ID,PARENT_ID,LEVELLVL,
  2. decode(connect_by_isleaf,1,'Y','N')IS_LEAF
  3. FROMidb_hierarchicalI
  4. STARTWITHPARENT_IDISNULL
  5. CONNECTBYPARENT_ID=PRIORID;
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_LEVELIDPARENT_IDLVLIS_LEAF
+..A11N
+....B212N
+......C323N
+........D434N
+..........H845Y
+..........I945Y
+........G734Y
+......E523Y
+......F623Y
+..J101N
+....K11102N
+......L12113Y
+....M13102Y
oracle 10g用connect_by_root判断根节点
  1. SELECTRPAD('+',LEVEL*2+1,'.')||STRSTR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. LEVELLVL,
  5. connect_by_rootSTRROOT_STR
  6. FROMidb_hierarchicalI
  7. STARTWITHid=2
  8. CONNECTBYPARENT_ID=PRIORID;
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_LEVELIDPARENT_IDLVLROOT_STR
+..B211B
+....C322B
+......D433B
+........H844B
+........I944B
+......G733B
+....E522B
+....F622B
  1. SELECTRPAD('+',LEVEL*2+1,'.')||STRSTR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. DECODE(LEVEL,1,'Y','N')is_root,
  5. LEVELLVL,
  6. connect_by_rootSTRROOT_STR
  7. FROMidb_hierarchicalI
  8. STARTWITHid=3
  9. CONNECTBYPARENT_ID=PRIORID;
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_LEVELIDPARENT_IDIS_ROOTLVLROOT_STR
+..C32Y1C
+....D43N2C
+......H84N3C
+......I94N3C
+....G73N2C
  1. SELECTRPAD('+',LEVEL*2+1,'.')||STRSTR_LEVEL,
  2. ID,
  3. PARENT_ID,
  4. DECODE(LEVEL,1,'Y','N')is_root,
  5. LEVELLVL,
  6. connect_by_rootSTRROOT_STR
  7. FROMidb_hierarchicalI
  8. STARTWITHPARENT_ID=2
  9. CONNECTBYPARENT_ID=PRIORID;
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_LEVELIDPARENT_IDIS_ROOTLVLROOT_STR
+..C32Y1C
+....D43N2C
+......H84N3C
+......I94N3C
+....G73N2C
+..E52Y1E
+..F62Y1F


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值