免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
PostgreSQL遞歸查詢上下級節(jié)點(diǎn)樹(從子到父、從父到子)
    • 字典表結(jié)構(gòu)(dictionary)
    • 字典表數(shù)據(jù)
    • 開始遞歸查詢
      • 向下遞歸(從父到子)
      • 向上遞歸(從子到父)
    • 結(jié)語

場景:
數(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é)點(diǎn)集合(就是找出 父節(jié)點(diǎn)對象不存在的就是頂層),然后循環(huán)這個集合挨個拼成這些樹,并且再放進(jìn)一個tree集合中,從而形成一個多樹的json,但是此種方法有一個很大的問題:效果上看導(dǎo)致小樹的頂層位置都從最前面開始了,與實際不否,實際中應(yīng)該是錯開的幾棵樹,綜述實際開發(fā)中不會有這樣的結(jié)果list。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
常見數(shù)據(jù)庫設(shè)計(1)——字典數(shù)據(jù)
使用Python讀取,寫入和解析JSON
Stardict 81部中文詞典下載
Oracle用Start with...Connect By子句遞歸查詢
在線詞典
Oracle中用LogMiner分析重做及歸檔日志2
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服