小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

PostgreSQL遞歸查詢上下級節(jié)點樹(從子到父、從父到子)

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

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

字典表結(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

開始遞歸查詢

向下遞歸(從父到子)

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é)語

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

?


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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多