亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術(shù)文章
文章詳情頁

Oracle遞歸查詢樹形數(shù)據(jù)實例代碼

瀏覽:126日期:2023-03-12 15:25:42
目錄
  • 概述
  • 1、數(shù)據(jù)準(zhǔn)備
  • 2 start with connect by prior遞歸查詢
    • 2.1 查詢所有子節(jié)點
    • 2.2 查詢所有父節(jié)點
    • 2.3 查詢指定節(jié)點的根節(jié)點
    • 2.4 查詢下行政組織遞歸路徑
  • 3 with遞歸查詢
    • 3.1 with遞歸子類
    • 3.2 遞歸父類
  • 4 MySQL 遞歸查找樹形結(jié)構(gòu)
    • 總結(jié)

      概述

      實際生活有很多樹形結(jié)構(gòu)的數(shù)據(jù),比如公司分為多個部門,部門下分為多個組,組下分為多個員工;省市縣的歸屬;頁面菜單欄等等。

      如果想查詢某個節(jié)點的父節(jié)點或者子節(jié)點,一般通過表自身連接完成,但如果該節(jié)點的子節(jié)點還有多層結(jié)構(gòu),就需要使用遞歸調(diào)用。但如果數(shù)據(jù)量特別大,遞歸的次數(shù)指數(shù)級上升,而且查詢數(shù)據(jù)庫的次數(shù)也指數(shù)級上升,導(dǎo)致程序和數(shù)據(jù)庫壓力劇增,查詢時間特別長。那數(shù)據(jù)庫有沒有遞歸查詢語句呢?答案是肯定的。

      start with connect by prior 遞歸查詢

      1、數(shù)據(jù)準(zhǔn)備

      create table area_test(  id number(10) not null,  parent_id  number(10),  name       varchar2(255) not null);alter table area_test add (constraint district_pk primary key (id));insert into area_test (ID, PARENT_ID, NAME) values (1, null, "中國");insert into area_test (ID, PARENT_ID, NAME) values (11, 1, "河南省"); insert into area_test (ID, PARENT_ID, NAME) values (12, 1, "北京市");insert into area_test (ID, PARENT_ID, NAME) values (111, 11, "鄭州市");insert into area_test (ID, PARENT_ID, NAME) values (112, 11, "平頂山市");insert into area_test (ID, PARENT_ID, NAME) values (113, 11, "洛陽市");insert into area_test (ID, PARENT_ID, NAME) values (114, 11, "新鄉(xiāng)市");insert into area_test (ID, PARENT_ID, NAME) values (115, 11, "南陽市");insert into area_test (ID, PARENT_ID, NAME) values (121, 12, "朝陽區(qū)");insert into area_test (ID, PARENT_ID, NAME) values (122, 12, "昌平區(qū)");insert into area_test (ID, PARENT_ID, NAME) values (1111, 111, "二七區(qū)");insert into area_test (ID, PARENT_ID, NAME) values (1112, 111, "中原區(qū)");insert into area_test (ID, PARENT_ID, NAME) values (1113, 111, "新鄭市");insert into area_test (ID, PARENT_ID, NAME) values (1114, 111, "經(jīng)開區(qū)");insert into area_test (ID, PARENT_ID, NAME) values (1115, 111, "金水區(qū)");insert into area_test (ID, PARENT_ID, NAME) values (1121, 112, "湛河區(qū)");insert into area_test (ID, PARENT_ID, NAME) values (1122, 112, "舞鋼市");insert into area_test (ID, PARENT_ID, NAME) values (1123, 112, "寶豐市");insert into area_test (ID, PARENT_ID, NAME) values (11221, 1122, "尚店鎮(zhèn)");

      2 start with connect by prior遞歸查詢

      • start with 子句:遍歷起始條件。如果要查父結(jié)點,這里可以用子結(jié)點的列,反之亦然。
      • connect by 子句:連接條件。prior 跟父節(jié)點列parentid放在一起,就是往父結(jié)點方向遍歷;prior 跟子結(jié)點列subid放在一起,則往葉子結(jié)點方向遍歷。parent_id、id兩列誰放在 “=” 前都無所謂,關(guān)鍵是prior跟誰在一起。
      • order by 子句:排序。

      常用的select項:

      LEVEL:級別
      connect_by_root:根節(jié)點
      sys_connect_by_path:遞歸路徑

      2.1 查詢所有子節(jié)點

      select t.*,LEVELfrom area_test tstart with name ="鄭州市"connect by prior id=parent_id

      其實,如果單層結(jié)構(gòu),使用表自身連接也可以實現(xiàn):

      select * from area_test t1,area_test t2 where t1.PARENT_ID = t2.ID and t2.name="鄭州市";

      當(dāng)查詢節(jié)點下有多層數(shù)據(jù):

      select t.*,LEVELfrom area_test tstart with name ="河南省"connect by prior id=parent_id

      select * from area_test t1,area_test t2 where t1.PARENT_ID = t2.ID and t2.name="河南省";

      如果使用自身連接,也只能查到子一級節(jié)點的數(shù)據(jù),需要遍歷子一級節(jié)點,遞歸查詢每個子一級節(jié)點下的子節(jié)點。明顯麻煩很多!!!

      2.2 查詢所有父節(jié)點

      select t.*,levelfrom area_test tstart with name ="鄭州市"connect by prior t.parent_id=t.idorder by level asc;

      2.3 查詢指定節(jié)點的根節(jié)點

      select d.*,	   connect_by_root(d.id) rootid,	   connect_by_root(d.name) rootnamefrom area_test dwhere name="二七區(qū)"start with d.parent_id IS NULLconnect by prior d.id=d.parent_id

      select d.*,	   connect_by_root(d.id) rootid,	   connect_by_root(d.name) rootnamefrom area_test dstart with d.parent_id IS NULLconnect by prior d.id=d.parent_id

      2.4 查詢下行政組織遞歸路徑

      select id, parent_id, name, sys_connect_by_path(name, "->") namepath, levelfrom area_teststart with name = "平頂山市"connect by prior id = parent_id

      3 with遞歸查詢

      3.1 with遞歸子類

      with tmp(id, parent_id, name) as (	select id, parent_id, name    from area_test    where name = "平頂山市"    union all    select d.id, d.parent_id, d.name    from tmp, area_test d    where tmp.id = d.parent_id   )select * from tmp;

      3.2 遞歸父類

      with tmp(id, parent_id, name) as  (   select id, parent_id, name   from area_test   where name = "二七區(qū)"   union all   select d.id, d.parent_id, d.name   from tmp, area_test d   where tmp.parent_id = d.id   )select * from tmp;

      4 MySQL 遞歸查找樹形結(jié)構(gòu)

      參考文章:MySQL 遞歸查找樹形結(jié)構(gòu),這個方法太實用了

      參考文章:Oracle遞歸查詢

      總結(jié)

      到此這篇關(guān)于Oracle遞歸查詢樹形數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Oracle遞歸查詢樹形數(shù)據(jù)內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

      標(biāo)簽: Oracle
      主站蜘蛛池模板: 国产精品久久久久久吹潮 | 亚洲精品一区二区三区中文字幕 | 色综合久久久久 | 久久国产精品免费观看 | 俄罗斯一级毛片免费播放 | 国产精品每日更新在线观看 | 男人久久天堂 | 中国精品自拍 | 欧美一区二区在线免费观看 | 日韩一区在线播放 | 一级做a爱 | 欧美日韩亚洲成色二本道三区 | 成年女人毛片免费观看97 | 国产成人久久久精品毛片 | 国产黄色一级毛片 | 国产精品福利午夜一级毛片 | 欧美午夜在线观看理论片 | 国产成人精品日本亚洲语音2 | 亚洲人成在线播放网站岛国 | 一级毛片儿 | 亚洲国产第一 | 国产精品久久久久久一区二区三区 | 1a级毛片免费观看 | 伊人久久影视 | 国产精品九九 | 欧美做a欧美| 九草在线免费观看 | 久久99这里只有精品国产 | 国产成人亚洲综合91精品555 | 免费一级毛片在线播放欧美 | 成人18视频在线 | 日本尹人综合香蕉在线观看 | 欧美激情伦妇在线观看 | 7777视频| 日韩精品首页 | 久久在线一区 | 国产一区二区三区免费播放 | 国产日韩免费 | 亚洲资源在线 | 久久久久久综合一区中文字幕 | 久久久久免费视频 |