多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 數據庫 > 數據庫應用 > Oracle 遞歸查詢詳解

Oracle 遞歸查詢詳解

來源:程序員人生   發布時間:2015-02-27 07:53:43 閱讀次數:5348次

創建表和主外鍵

CREATE TABLE SC_DISTRICT ( ID NUMBER(10) NOT NULL, PARENT_ID NUMBER(10), NAME VARCHAR2(255 BYTE) NOT NULL ); ALTER TABLE SC_DISTRICT ADD ( CONSTRAINT SC_DISTRICT_PK PRIMARY KEY (ID)); ALTER TABLE SC_DISTRICT ADD ( CONSTRAINT SC_DISTRICT_R01 FOREIGN KEY (PARENT_ID) REFERENCES SC_DISTRICT (ID) );

插入數據

insert into A_DISTRICT (id, parent_id, name) values (1, null, '河南省'); insert into A_DISTRICT (id, parent_id, name) values (2, null, '山東省'); insert into A_DISTRICT (id, parent_id, name) values (3, 1, '鄭州市'); insert into A_DISTRICT (id, parent_id, name) values (4, 1, '開封市'); insert into A_DISTRICT (id, parent_id, name) values (5, 1, '商丘市'); insert into A_DISTRICT (id, parent_id, name) values (6, 3, '中原區'); insert into A_DISTRICT (id, parent_id, name) values (7, 3, '金水區'); insert into A_DISTRICT (id, parent_id, name) values (8, 3, '27區'); insert into A_DISTRICT (id, parent_id, name) values (9, 3, '城管回族區'); insert into A_DISTRICT (id, parent_id, name) values (10, 3, '上街區'); insert into A_DISTRICT (id, parent_id, name) values (11, 3, '惠濟區'); insert into A_DISTRICT (id, parent_id, name) values (12, 4, '開封縣'); insert into A_DISTRICT (id, parent_id, name) values (13, 4, '杞縣'); insert into A_DISTRICT (id, parent_id, name) values (14, 4, '蘭考縣'); insert into A_DISTRICT (id, parent_id, name) values (15, 4, '通許縣'); insert into A_DISTRICT (id, parent_id, name) values (16, 13, '城關鎮'); insert into A_DISTRICT (id, parent_id, name) values (17, 13, '5里河鎮'); insert into A_DISTRICT (id, parent_id, name) values (18, 13, '邢口鎮'); insert into A_DISTRICT (id, parent_id, name) values (19, 13, '柿園鄉'); insert into A_DISTRICT (id, parent_id, name) values (20, 13, '城郊鄉');
生成數據以下

遞歸語法和主要使用函數

      select * from 表 start with 條件入口 connect by prior id =  parent_id(向下)

      select * from 表 start with 條件入口 connect by prior parent_id = id(向上)

如果不寫prior,表明前序遍歷 未指明遍歷方向,所以不進行遞歸,習慣上會在語句后面加上order by排序和group by分組

      connect_by_root(列名)  查詢根節點

      connect_by_isleaf   查詢是不是葉子節點,0是,1不是

      sys_connect_by_path  查詢遞歸路徑

實戰

查詢根節點

select id, parent_id, name from a_district start with parent_id is null connect by id = parent_id order by id

遞歸查詢 杞縣 的所有上級節點(包括當前節點)

select id, parent_id, name from a_district start with name='杞縣' connect by prior parent_id = id order by id

遞歸查詢 杞縣 的所有上級節點(包括當前節點和根節點)

select id, parent_id, name,connect_by_root(id) city_id, connect_by_root(name) city_name from a_district start with name='杞縣' connect by prior parent_id = id order by id


遞歸查詢 杞縣 的所有子城鎮鄉(包括當前節點)

select id, parent_id, name from a_district start with name='杞縣' connect by prior id = parent_id order by id

遞歸查詢 開封市 的所有城鎮鄉(包括當前節點和根節點)

select id, parent_id, name, connect_by_root(id) city_id, connect_by_root(name) city_name from a_district start with name='開封市' connect by prior id = parent_id order by id

上行遞歸查詢 城郊鄉 深度、是不是包括葉子節點

select id, name, parent_id, level, connect_by_isleaf isleaf from a_district start with name = '城郊鄉' connect by prior parent_id = id order by id

下行遞歸查詢 河南省 深度、是不是包括葉子節點

select id, name, parent_id, level, connect_by_isleaf isleaf from a_district start with name = '河南省' connect by prior id = parent_id order by id

上行遞歸查詢 杞縣 路徑

select id, name, parent_id, substr(sys_connect_by_path(name,'->'),3) name_path from a_district start with name='杞縣' connect by prior parent_id = id order by id

下行遞歸查詢 河南省 路徑

select id, name, parent_id, substr(sys_connect_by_path(name,'->'),3) name_path from a_district start with name='河南省' connect by prior id = parent_id order by id

綜合使用

select id, name, parent_id, level, connect_by_isleaf isleaf, substr(sys_connect_by_path(name,'->'),3) name_path from a_district start with name='河南省' connect by prior id = parent_id order by id

SYS_CONNECT_BY_PATH函數

        在Oracle中,SYS_CONNECT_BY_PATH函數主要作用是可以把1個父節點下的所有子節點通過某個字符進行辨別,然后連接在1個列中顯示。
        sys_connect_by_path(字段名, 2個字段之間的連接符號),注意這里的連接符號不要使用逗號,oracle會報錯,如果1定要用,可使用replace替換1下,REPLACE(字段名,原字符,',')。
        還有,這個函數使用之前必須先建立1個樹,否則無用。



生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 久久国产成人精品国产成人亚洲 | 午夜dj在线观看免费高清在线 | 伊人中文网 | 美日韩一区二区 | julia一区二区三区中文字幕 | 国产香蕉在线精彩视频 | 伦理免费在线观看 | 亚洲精品视频在线观看免费 | 久久影视免费观看网址 | 亚州第一视频 | 1000部禁止18观看视频在线看 | 国产一级一片 | 伊人99| 日本久久综合视频 | 午色| 久久国产精品免费 | 韩国全部三级伦在线 | 在线亚洲+欧美+日本专区 | 精品一区二区三区免费观看 | 亚洲 欧美 小说 | 亚洲国产成人精彩精品 | 图片区小说区校园小说 | 亚洲hd| 手机在线精品视频每日更新 | 欧美13一14周岁a在线播放 | 琪琪在线影院 | 久久99国产综合精品 | 国产性老妇女做爰在线 | 亚洲国产福利 | 羞羞影院免费观看网址在线 | 成人自拍在线 | 久久国内精品 | 日韩在线专区 | 亚洲午夜久久久久中文字幕久 | freemovies性老女人 | 伊人猫咪 | 91精品久久久久久久久久 | 性―交―乱―色―情 | 亚洲h视频在线观看 | 青草欧美 | 日韩欧美一及在线播放 |