日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/3/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle 层次查询判断叶子和根节点 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

oracle 9i判斷是葉子或根節(jié)點,是比較麻煩的一件事情,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');??
  • 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');

    示例數(shù)據(jù)清單如下:

    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 LVLFROM idb_hierarchicalSTART WITH PARENT_ID IS NULL CONNECT BY PARENT_ID = PRIOR ID; 表1:數(shù)據(jù)清單STR_LEVELIDPARENT_IDLVL
    +..A1?1
    +….B212
    +……C323
    +……..D434
    +……….H845
    +……….I945
    +……..G734
    +……E523
    +……F623
    +..J10?1
    +….K11102
    +……L12113
    +….M13102

    在表1中,ID為8、9、 7、5、6、12、13都沒有子節(jié)點,因此稱為葉節(jié)點。

    1.oracle9i 查詢?nèi)~節(jié)點

    只顯示葉子節(jié)點SQL

    view plaincopy to clipboardprint?
  • SELECT?RPAD('+',LEVEL*2+1,'.')||STR?STR_LEVEL,ID,PARENT_ID,LEVEL?LVL??
  • ??FROM?idb_hierarchical?I??
  • ??--在oracle?9i中顯示葉節(jié)點,需要判斷是否有子節(jié)點即可??
  • ??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 LVLFROM idb_hierarchical I--在oracle 9i中顯示葉節(jié)點,需要判斷是否有子節(jié)點即可WHERE NOT EXISTS(SELECT 1FROM idb_hierarchical BWHERE 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

    顯示所有節(jié)點,標明該行是否為葉節(jié)點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;??
  • SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL, NVL((SELECT 'N'FROM idb_hierarchical BWHERE I.ID=B.PARENT_IDAND ROWNUM < 2),'Y') IS_LEAFFROM idb_hierarchical ISTART WITH PARENT_ID IS NULL CONNECT BY PARENT_ID = PRIOR ID; 表3
    STR_LEVELIDPARENT_IDLVLIS_LEAF
    +..A1?1N
    +....B212N
    +......C323N
    +........D434N
    +..........H845Y
    +..........I945Y
    +........G734Y
    +......E523Y
    +......F623Y
    +..J10?1N
    +....K11102N
    +......L12113Y
    +....M13102Y

    oracle 9i 查詢根節(jié)點

    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;??
  • SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVLFROM idb_hierarchical ISTART WITH id =2 CONNECT BY PARENT_ID = PRIOR ID; 表4
    STR_LEVELIDPARENT_IDLVL
    +..B211
    +....C322
    +......D433
    +........H844
    +........I944
    +......G733
    +....E522
    +....F622

    根節(jié)點ID應該為3、5、6,即lvl為1即可

    查詢根節(jié)點,只顯示根節(jié)點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;??
  • SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL,(select b.strfrom idb_hierarchical bwhere level = 1start with b.id = 2connect by prior b.id = b.parent_id) root_strFROM idb_hierarchical Iwhere level = 1START WITH id = 2 CONNECT BY PARENT_ID = PRIOR ID; 表5
    STR_LEVELIDPARENT_IDLVLROOT_STR
    +..B211B

    標明根節(jié)點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;??
  • SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,ID,PARENT_ID,DECODE(LEVEL, 1, 'Y', 'N') is_root,LEVEL LVL,(select b.strfrom idb_hierarchical bwhere level = 1start with b.id = 2connect by prior b.id = b.parent_id) root_strFROM idb_hierarchical ISTART 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判斷葉節(jié)點

    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;??
  • SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVLFROM idb_hierarchical I where connect_by_isleaf=1START WITH PARENT_ID IS NULL CONNECT BY PARENT_ID = PRIOR ID; 表7
    STR_LEVELIDPARENT_IDLVL
    +..........H845
    +..........I945
    +........G734
    +......E523
    +......F623
    +......L12113
    +....M13102
    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;??
  • SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL, decode(connect_by_isleaf,1,'Y','N') IS_LEAFFROM idb_hierarchical ISTART WITH PARENT_ID IS NULL CONNECT BY PARENT_ID = PRIOR ID; 表8
    STR_LEVELIDPARENT_IDLVLIS_LEAF
    +..A1?1N
    +....B212N
    +......C323N
    +........D434N
    +..........H845Y
    +..........I945Y
    +........G734Y
    +......E523Y
    +......F623Y
    +..J10?1N
    +....K11102N
    +......L12113Y
    +....M13102Y

    oracle 10g用connect_by_root判斷根節(jié)點

    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;??
  • SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL,connect_by_root STR ROOT_STRFROM idb_hierarchical ISTART WITH id = 2 CONNECT BY PARENT_ID = PRIOR ID; 表9STR_LEVELIDPARENT_IDLVLROOT_STR
    +..B211B
    +....C322B
    +......D433B
    +........H844B
    +........I944B
    +......G733B
    +....E522B
    +....F622B
    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;??
  • 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_STRFROM idb_hierarchical ISTART WITH id = 3 CONNECT BY PARENT_ID = PRIOR ID; 表10STR_LEVELIDPARENT_IDIS_ROOTLVLROOT_STR
    +..C32Y1C
    +....D43N2C
    +......H84N3C
    +......I94N3C
    +....G73N2C
    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;??
  • 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_STRFROM idb_hierarchical ISTART WITH PARENT_ID = 2 CONNECT BY PARENT_ID = PRIOR ID; 表11STR_LEVELIDPARENT_IDIS_ROOTLVLROOT_STR
    +..C32Y1C
    +....D43N2C
    +......H84N3C
    +......I94N3C
    +....G73N2C
    +..E52Y1E
    +..F62Y1F


    總結

    以上是生活随笔為你收集整理的oracle 层次查询判断叶子和根节点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。