成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > PostgreSQL樹形結(jié)構(gòu)的遞歸查詢示例

PostgreSQL樹形結(jié)構(gòu)的遞歸查詢示例

熱門標(biāo)簽:外呼調(diào)研系統(tǒng) 地圖標(biāo)注和圖片名稱的區(qū)別 重慶自動(dòng)外呼系統(tǒng)定制 漯河外呼電話系統(tǒng) 美容工作室地圖標(biāo)注 合肥公司外呼系統(tǒng)運(yùn)營商 打電話智能電銷機(jī)器人授權(quán) 辦公外呼電話系統(tǒng) 海豐有多少商家沒有地圖標(biāo)注

背景

處理不確定深度的層級結(jié)構(gòu),比如組織機(jī)構(gòu),一個(gè)常用的設(shè)計(jì)是在一張表里面保存 ID 和 Parent_ID ,并且通過自聯(lián)結(jié)的辦法構(gòu)造一顆樹。這種方式對寫數(shù)據(jù)的過程很友好,但是查詢過程就變得相對復(fù)雜。在不引入MPTT模型的前提下,必須通過遞歸算法來查詢某個(gè)節(jié)點(diǎn)和下級子節(jié)點(diǎn)。

Oracle提供的connect by擴(kuò)展語法,簡單好用。但是其他的RDBMS就沒這么人性化了(或者我不知道)。最近在項(xiàng)目中使用PostgreSQL來查詢樹形數(shù)據(jù),記錄一下。

構(gòu)造樣本數(shù)據(jù)

drop table if exists demo.tree_data;
create table demo.tree_data (
 id integer,
 code text,
 pid integer,
 sort integer
);

insert into demo.tree_data values(1, '中國', null, 1);
insert into demo.tree_data values(2, '四川', 1, 1);
insert into demo.tree_data values(3, '云南', 1, 2);
insert into demo.tree_data values(4, '成都', 2, 1);
insert into demo.tree_data values(5, '綿陽', 2, 2);	
insert into demo.tree_data values(6, '武侯區(qū)', 4, 1);
insert into demo.tree_data values(7, '昆明', 3, 1);	

connectby函數(shù)

如果安裝了 tablefunc 擴(kuò)展,就可以使用PG版本的connectby函數(shù)。這個(gè)沒有Oracle那么強(qiáng)大,但是可以滿足基本要求。

-- API 如下
connectby(text relname, 			-- 表名稱
  text keyid_fld, 			-- id字段
  text parent_keyid_fld		-- 父id字段	
  [, text orderby_fld ], 	-- 排序字段
  text start_with, 			-- 起始行的id值
  int max_depth				-- 樹深度,0表示無限
  [, text branch_delim ])	-- 路徑分隔符
-- 基本用法如下,必須通過AS子句定義返回的字段名稱和類型
select * 
	from connectby('demo.tree_data', 'id', 'pid', 'sort', '1', 0, '~')
	as (id int, pid int, lvl int, branch text, sort int);
	
-- 查詢結(jié)果
id | pid | lvl | branch | sort
----+-----+-----+---------+------
 1 | | 0 | 1 | 1
 2 | 1 | 1 | 1~2 | 2
 4 | 2 | 2 | 1~2~4 | 3
 6 | 4 | 3 | 1~2~4~6 | 4
 5 | 2 | 2 | 1~2~5 | 5
 3 | 1 | 1 | 1~3 | 6
 7 | 3 | 2 | 1~3~7 | 7
(7 rows)
-- 僅僅使用基本用法,只能查詢出id的相關(guān)信息,如果要查詢code等其他字段,就需要通過額外的join操作來實(shí)現(xiàn)。
select 
	t.id, n.code, t.pid, p.code as pcode, lvl, branch
from (
	select * from connectby('demo.tree_data', 'id', 'pid', 'sort', '1', 0, '~')
		as (id int, pid int, lvl int, branch text, sort int)
) as t
	left join demo.tree_data as n on (t.id = n.id)
	left join demo.tree_data as p on (t.pid = p.id)
order by t.sort ;	

 id | code | pid | pcode | lvl | branch
----+--------+-----+-------+-----+---------
 1 | 中國 | | | 0 | 1
 2 | 四川 | 1 | 中國 | 1 | 1~2
 4 | 成都 | 2 | 四川 | 2 | 1~2~4
 6 | 武侯區(qū) | 4 | 成都 | 3 | 1~2~4~6
 5 | 綿陽 | 2 | 四川 | 2 | 1~2~5
 3 | 云南 | 1 | 中國 | 1 | 1~3
 7 | 昆明 | 3 | 云南 | 2 | 1~3~7
(7 rows)

PS:雖然通過join可以查詢出節(jié)點(diǎn)的code,但是branch部分不能直接轉(zhuǎn)換成對應(yīng)的code,使用上還是不太方便。

CTE語法

使用CTE語法,通過 with recursive 來實(shí)現(xiàn)樹形數(shù)據(jù)的遞歸查詢。這個(gè)方法雖然沒有connectby那么直接,但是靈活性和顯示效果更好。

-- 
with recursive cte as
(
 -- 先查詢r(jià)oot節(jié)點(diǎn) 
 select
 id, code, pid, '' as pcode,
 code as branch
 from demo.tree_data where id = 1
 union all
 -- 通過cte遞歸查詢r(jià)oot節(jié)點(diǎn)的直接子節(jié)點(diǎn) 
 select
 origin.id, origin.code, cte.id as pid, cte.code as pcode,
 cte.branch || '~' || origin.code
 from cte
 join demo.tree_data as origin on origin.pid = cte.id
)
select
 id,code, pid, pcode, branch, 
 -- 通過計(jì)算分隔符的個(gè)數(shù),模擬計(jì)算出樹形的深度
 (length(branch)-length(replace(branch, '~', ''))) as lvl
from cte;

-- 
 id | code | pid | pcode | branch  | lvl
----+--------+-----+-------+-----------------------+-----
 1 | 中國 | | | 中國   | 0
 2 | 四川 | 1 | 中國 | 中國~四川  | 1
 3 | 云南 | 1 | 中國 | 中國~云南  | 1
 4 | 成都 | 2 | 四川 | 中國~四川~成都 | 2
 5 | 綿陽 | 2 | 四川 | 中國~四川~綿陽 | 2
 7 | 昆明 | 3 | 云南 | 中國~云南~昆明 | 2
 6 | 武侯區(qū) | 4 | 成都 | 中國~四川~成都~武侯區(qū) | 3
(7 rows)

執(zhí)行過程說明

從上面的例子可以看出,WITH RECURSIVE語句包含了兩個(gè)部分

  • non-recursive term(非遞歸部分),即上例中的union all前面部分
  • recursive term(遞歸部分),即上例中union all后面部分

執(zhí)行步驟如下

  • 執(zhí)行non-recursive term。(如果使用的是union而非union all,則需對結(jié)果去重)其結(jié)果作為recursive term中對result的引用,同時(shí)將這部分結(jié)果放入臨時(shí)的working table中
  • 重復(fù)執(zhí)行如下步驟,直到working table為空:用working table的內(nèi)容替換遞歸的自引用,執(zhí)行recursive term,(如果使用union而非union all,去除重復(fù)數(shù)據(jù)),并用該結(jié)果(如果使用union而非union all,則是去重后的結(jié)果)替換working table

以上面的query為例,來看看具體過程

執(zhí)行non-recursive query

-- step 1 執(zhí)行
 select
 id, code, pid, '' as pcode,
 code as branch
 from demo.tree_data where id = 1
 
-- 結(jié)果集和working table為
 id | code | pid | pcode | branch
----+------+-----+-------+--------
 1 | 中國 | | | 中國

執(zhí)行recursive query

-- step 2 執(zhí)行遞歸,此時(shí)自引用cte中的數(shù)據(jù)是step 1的結(jié)果
 select
 origin.id, origin.code, cte.id as pid, cte.code as pcode,
 cte.branch || '~' || origin.code
 from cte
 join demo.tree_data as origin on origin.pid = cte.id
 
 -- 結(jié)果集和working table為
 id | code | pid | pcode | branch 
----+--------+-----+-------+---------------------
 2 | 四川 | 1 | 中國 | 中國~四川  
 3 | 云南 | 1 | 中國 | 中國~云南  

3、繼續(xù)執(zhí)行recursive query,直到結(jié)果集和working table為空

4、結(jié)束遞歸,將前三個(gè)步驟的結(jié)果集合并,即得到最終的WITH RECURSIVE的結(jié)果集。

嚴(yán)格來講,這個(gè)過程實(shí)現(xiàn)上是一個(gè)迭代的過程而非遞歸,不過RECURSIVE這個(gè)關(guān)鍵詞是SQL標(biāo)準(zhǔn)委員會(huì)定立的,所以PostgreSQL也延用了RECURSIVE這一關(guān)鍵詞。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • PostgreSQL圖(graph)的遞歸查詢實(shí)例
  • 在PostgreSQL中實(shí)現(xiàn)遞歸查詢的教程
  • PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的方法

標(biāo)簽:烏海 晉城 衡陽 來賓 蚌埠 錦州 珠海 株洲

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PostgreSQL樹形結(jié)構(gòu)的遞歸查詢示例》,本文關(guān)鍵詞  PostgreSQL,樹形,結(jié)構(gòu),的,遞歸,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PostgreSQL樹形結(jié)構(gòu)的遞歸查詢示例》相關(guān)的同類信息!
  • 本頁收集關(guān)于PostgreSQL樹形結(jié)構(gòu)的遞歸查詢示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    九色视频在线播放| 久久66热re国产| 欧美一区国产在线| 国产精品视频入口| 亚洲欧美国产精品久久久久久久| 国产乱淫av片免费| 国产成人欧美日韩在线电影| 欧美日韩一卡二卡| 国产jjizz一区二区三区视频| 一级二级在线观看| 青青草原综合久久大伊人精品| 欧洲av不卡| 欧美国产欧美亚州国产日韩mv天天看完整| 国产精品视频成人| 亚洲狼人精品一区二区三区| 福利视频在线播放| 福利视频网址| 成人h片在线播放免费网站| 日韩va亚洲va欧美va清高| 日本高清免费电影一区| 欧美成人性色生活仑片| 国产日产精品一区二区三区的介绍| 日本a在线观看| 欧美va亚洲va国产综合| 欧美性淫爽ww久久久久无| 欧美激情一区二区三区免费观看| 国产成人美女视频| 无码精品国产一区二区三区免费| 无遮挡h肉3d动漫在线观看| 中文字幕av免费观看| 自拍偷拍亚洲| 无码小电影在线观看网站免费| 欧美大片大片在线播放| 日本亚洲视频| 亚洲国产aⅴ天堂久久| 久久精品亚洲一区二区三区浴池| 国产福利视频一区二区三区| 91精品国产综合久久久久久久久久| 成人性生活视频免费看| 国产精品自产拍在线观看2019| 欧美在线视频一二三| 精品国产露脸精彩对白| 日本欧美在线视频免费观看| 免费看一区二区三区| 亚洲成人精品一区二区三区| 999精品嫩草久久久久久99| 久久久久久亚洲av无码专区| 91精品人妻一区二区三区蜜桃2| 极品魔鬼身材女神啪啪精品| 亚洲精品色婷婷福利天堂| 国产又粗又猛又爽又黄91精品| 91影院未满十八岁禁止入内| 精品国产成人在线影院| 91精品国产沙发| 天堂成人娱乐在线视频免费播放网站| 日韩片欧美片| 日韩免费精品| 天天堂资源网在线观看免费视频| 婷婷精品国产一区二区三区日韩| 涩涩网站在线看| 国产亚洲综合久久| 亚洲精品毛片一区二区三区| 国产亚av手机在线观看| 国产精品久久久久一区二区国产| 亚洲国产精品精华液2区45| 疯狂试爱三2浴室激情视频| www.男人的天堂.com| 在线播放日韩欧美| 亚洲欧美另类小说| 国产三级国产精品国产专区50| 一区二区视频免费看| 欧洲熟妇的性久久久久久| 国产精品123区| 黄色成人影院| 男女小视频在线观看| 国产精品www| 国产精品日韩专区| 99香蕉国产精品偷在线观看| 免费成人深夜夜行视频| 国产一区二区在线视频| 色诱视频网站一区| 视频在线不卡| 伊人久久男人天堂| 国产三级电影在线| 337p日本欧洲亚洲大胆色噜噜| 国产视频2区| 久草在线资源福利| 一区二区久久久久久| 首页欧美精品中文字幕| 免费一区二区三区视频狠狠| 成人h视频在线| 久久久久久一级片| 制服.丝袜.亚洲.另类.中文| 亚洲三级视频在线观看| 国产成人久久久精品一区| 日韩高清一区二区| 好吊色一区二区三区| 国产一区二区伦理| 欧美在线亚洲在线| 欧美日韩国产综合一区二区三区| 国产视频在线一区二区| 午夜精品一区二区三区视频免费看| 受虐m奴xxx在线观看| 激情亚洲网站| 成人免费黄色小视频| 一区中文字幕在线观看| 亚洲黄色毛片| 天堂va欧美ⅴa亚洲va一国产| 久久精品视频网站| 欧美 日韩 国产 高清| 国内成+人亚洲| 97人人澡人人爽91综合色| 久久亚洲精品人成综合网| 快灬快灬一下爽蜜桃在线观看| 日韩av在线第一页| 黄色成人av在线| 国产乱了高清露脸对白| 625成人欧美午夜电影| www.com操| 久久久视频免费观看| 欧美精品密入口播放| 在线免费av网址| 九九热这里有精品| 欧美成人久久久| 中文天堂最新版本在线观看| 色香蕉久久蜜桃| 美女写真久久影院| 国产福利电影在线观看| 亚洲一区二区久久久久久久| 欧洲天堂在线观看| 99热这里只有精品7| 欧美激情一区不卡| 亚洲福利专区| 99久久99久久久精品齐齐| 成人偷拍自拍| 99精品黄色片免费大全| 先锋影音av中文字幕| 91av国产精品| 亚洲精品成人少妇| jizzjizzjizz美国| 久久国产精品毛片| 国产精品嫩草影院久久久| 亚洲精品一区在线观看香蕉| 国产免费黄视频| 国内精品视频免费| 成人黄色网免费| 日韩精品免费一区二区三区| 精品久久久网站| 动漫3d精品一区二区三区乱码| 久久丁香四色| 无码国产色欲xxxx视频| 久久99精品久久久野外观看| 亚洲国产精品二区| 久操视频在线观看| 久久av超碰| av资源亚洲| 香蕉视频国产在线| 国产 欧美 日韩 在线| 亚洲一区二区三区无吗| 乱色588欧美| 香蕉久久一区二区不卡无毒影院| 国产日本欧美一区二区三区在线| 久久精品成人一区二区三区| 欧美成人aa大片| 一区二区三区视频在线播放| 欧美一级黄色网| 欧美国产视频一区二区| 亚洲精品中文字幕乱码无线| 成人1区2区| 国产主播性色av福利精品一区| 夜夜嗨av一区二区三区网页| 国产精品一区二区av| 欧美日韩大陆在线| 国产丝袜护土调教在线视频| 日本黄色入口| 青青草影院在线观看| 国产精品久久久久久久久男| 婷婷综合网站| 亚洲精品国产高清久久伦理二区| 午夜精品在线视频一区| 99久久婷婷国产综合精品青牛牛| 另类的小说在线视频另类成人小视频在线| 欧美一级二级在线观看| 秋霞影院午夜丰满少妇在线视频| 2018日日夜夜| 在线观看视频免费| 国产男女av| 国产精品久久久久久久泡妞| jizz在线免费观看| 成人av免费在线看| 精品无人国产偷自产在线| 国产99999| 涩涩涩视频在线观看| 国产强被迫伦姧在线观看无码| 一级做a爱片性色毛片| 国产露脸91国语对白| 顶级网黄在线播放| 日韩欧美一区二区三区久久婷婷| 国产寡妇色xxⅹ交肉视频| 三级网站免费看| 欧美激情中文字幕在线| av电影在线观看网站| aaa一区二区| 国产精品入口免费| 97精品人妻一区二区三区在线| 成人全视频在线观看在线播放高清| 国产精品久久看| av电影在线观看不卡| av免费在线一区二区三区| 亚洲AV无码一区二区三区性| 精品肉辣文txt下载| 久久久久国产精品午夜一区| 成人在线综合网站| 国产主播色在线| 在线免费观看av影视天堂| 国产欧美高清视频在线| 亚洲午夜av久久乱码| aaa一级毛片| 日韩精品视频在线观看视频| 人妖一区二区三区| 亚洲美女视频网站| av在线精品| 午夜视频在线播放| 欧美美女一区二区在线观看| 黄色工厂这里只有精品| 小草在线视频免费播放| 欧美日韩国产一区二区三区| 内射国产内射夫妻免费频道| 亚洲妇女无套内射精| 曰本大片免费观看视频| 国产在线精品一区二区夜色| 五月天久久777| 高清毛片在线观看| 成人性生交大片免费看视频直播| 91精品久久久久久久久不口人| 久久影院电视剧免费观看| 国产精品无码一区二区三区免费| 国产偷拍一区二区| 国产精品一二一区| 色悠久久久久综合欧美99| 国产在线精品一区二区中文| 国产日韩一区二区三区| 国产一级二级在线| 亚洲字幕在线观看| 欧洲午夜精品久久久| 在线观看精品视频一区二区三区| 成人免费看片98欧美| 成人在线免费播放视频| www.com日本| 在线不卡a资源高清| 国产精品人人人人| 综合天堂av久久久久久久| 久久久精品一区二区涩爱| 头脑特工队2免费完整版在线观看| 一区二区三区免费播放| 天天爽夜夜爽一区二区三区| 麻豆成人小视频| 麻豆久久一区二区| 一本一本久久a久久综合精品蜜桃| h七七www色午夜日本| 综合国产第二页| 免费观看日韩av| 岛国一区二区在线观看| 国内精品免费午夜毛片| 午夜精品久久久久久久99热黄桃| 久久免费看少妇高潮| 国产寡妇树林野战在线播放| 污视频网站在线观看| 少妇荡乳情欲办公室456视频| 国产不卡免费视频| 久久国产一区| 国产精彩免费视频| 成人网在线免费视频| 欧美亚洲在线日韩| 4444在线观看| 亚洲人免费短视频| 国产精品久久久久9999| 99久久夜色精品国产亚洲1000部| 国产福利精品视频| 欧美日韩精品在线| heyzo视频在线播放| 欧美黑人精品一区二区不卡| 国产视频1区| 先锋资源在线视频| 国模私拍视频一区| 成人国产精品视频| 东京一区二区| 成人精品免费视频| 久久久精品2019中文字幕神马| 成人免费a级片| 亚洲色图21p| 成年大片免费视频播放二级| 26uuu成人网| 亚洲国产成人91porn| 亚洲欧美文学| 呦呦在线视频| 欧美一区免费| 国产夜色精品一区二区av| 免费av网站在线播放| 一区不卡字幕| 欧美成人一级视频| 国产精品传媒视频| 亚洲黄色影院| 欧美 日韩 国产 一区二区三区| 全部免费的黄色毛片| 91激情在线视频| 少妇大叫太大太粗太爽了a片小说| 国产精品国产三级国产普通话三级| 97人妻精品视频一区| 欧美视频第二页| 国产va亚洲va在线va| 亚洲欧美综合一区二区| 真实原创一区二区影院| 成人在线视频一区二区| 深夜视频在线免费| 美女日批视频在线观看| 激情六月丁香婷婷| 国产韩国精品一区二区三区| va视频在线观看| 都市激情综合| 轻点好疼好大好爽视频| 日本高清精品| 成年人看片网站| youjizz在线播放| 岛国片在线观看| 视频一区二区三区免费观看| 日韩免费视频网站| 国产日产一区二区|