日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

PostgreSQL遞歸查詢上下級(jí)節(jié)點(diǎn)樹(shù)(從子到父、從父到子)

 wwq圖書世界 2022-06-17 發(fā)布于山東

場(chǎng)景:
數(shù)據(jù)庫(kù)中的數(shù)據(jù)存在父子關(guān)系(單繼承,每一條記錄只有一個(gè)父記錄). 如果要查詢一條記錄以及他的所有子記錄,或者要查詢一條記錄以及他的所有父記錄.那么遞歸查詢就再合適不過(guò)了.可以簡(jiǎn)化復(fù)雜的SQL語(yǔ)句。
現(xiàn)在數(shù)據(jù)庫(kù)有一張dictionary表,用于存放業(yè)務(wù)相關(guān)字典項(xiàng)

字典表結(jié)構(gòu)(dictionary)

id,name,parent_id

字典表數(shù)據(jù)

idnameparentId
1字典1NULL
1-1字典1-11
1-2字典1-21
2字典2NULL
2-1字典2-12

開(kāi)始遞歸查詢

向下遞歸(從父到子)

WITH RECURSIVE dict AS (
     SELECT *
     FROM dictionary
     WHERE id= '1'
     union ALL
     SELECT dictionary.*
     FROM dictionary,
          dict
     WHERE dictionary.parent_id = dict.id
)
SELECT id AS id, name as name, parent_id as parentId
FROM dict
ORDER BY name

查詢結(jié)果

idnameparentId
1字典1NULL
1-1字典1-11
1-2字典1-21

向上遞歸(從子到父)

WITH RECURSIVE dict AS (
     SELECT *
     FROM dictionary
     WHERE id= '2-1'
     union ALL
     SELECT dictionary.*
     FROM dictionary,
          dict
     WHERE dictionary.id = dict.parent_id
)
SELECT id AS id, name as name, parent_id as parentId
FROM dict
ORDER BY name

查詢結(jié)果

idnameparentId
2字典2NULL
2-1字典2-12

結(jié)語(yǔ)

  1. sql中WITH xxxx AS () 是對(duì)一個(gè)查詢子句做別名,同時(shí)數(shù)據(jù)庫(kù)會(huì)對(duì)該子句生成臨時(shí)表;
  2. WITH RECURSIVE 則是一個(gè)遞歸的查詢子句,他會(huì)把查詢出來(lái)的結(jié)果再次代入到查詢子句中繼續(xù)查詢

?


//todo 此種方式都是查詢一棵樹(shù),如果結(jié)果list中有多棵截?cái)嗟臉?shù),需要遞歸查出來(lái)最頂層的parentId節(jié)點(diǎn)集合(就是找出 父節(jié)點(diǎn)對(duì)象不存在的就是頂層),然后循環(huán)這個(gè)集合挨個(gè)拼成這些樹(shù),并且再放進(jìn)一個(gè)tree集合中,從而形成一個(gè)多樹(shù)的json,但是此種方法有一個(gè)很大的問(wèn)題:效果上看導(dǎo)致小樹(shù)的頂層位置都從最前面開(kāi)始了,與實(shí)際不否,實(shí)際中應(yīng)該是錯(cuò)開(kāi)的幾棵樹(shù),綜述實(shí)際開(kāi)發(fā)中不會(huì)有這樣的結(jié)果list。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多