亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

SQL 雙親節(jié)點查找所有子節(jié)點的實現(xiàn)方法

2024-08-31 01:03:52
字體:
供稿:網(wǎng)友
下面小編就為大家?guī)硪黄猄QL 雙親節(jié)點查找所有子節(jié)點的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
 

怎么保存樹狀結(jié)構(gòu)的數(shù)據(jù)呢?在 SQL 中常用的是雙親節(jié)點法。創(chuàng)建表如下 

CREATE TABLE category ( id LONG, parentId LONG, name String(20) )INSERT INTO category VALUES ( 1, NULL, 'Root' )INSERT INTO category VALUES ( 2, 1, 'Branch1' )INSERT INTO category VALUES ( 3, 1, 'Branch2' )INSERT INTO category VALUES ( 4, 3, 'SubBranch1' )INSERT INTO category VALUES ( 5, 2, 'SubBranch2' )

其中,parent id 表示父節(jié)點, name 是節(jié)點名稱。

假設(shè)當前欲獲取某一節(jié)點下所有子節(jié)點(獲取后代 Descendants),該怎么做呢?如果使用程序(Java/PHP)遞歸調(diào)用,那么將在數(shù)據(jù)庫與本地開發(fā)語言之間來回訪問,效率之低可想而知。于是我們希望在數(shù)據(jù)庫的層面就可以完成,——該怎么做呢?

遞歸法

經(jīng)查詢,最好的方法(個人覺得)是 SQL 遞歸 CTE 的方法。所謂 CTE 是 Common Table Expressison 公用表表達式的意思。網(wǎng)友評價說:“CTE 是一種十分優(yōu)雅的存在。CTE 所帶來最大的好處是代碼可讀性的提升,這是良好代碼的必須品質(zhì)之一。使用遞歸 CTE 可以更加輕松愉快的用優(yōu)雅簡潔的方式實現(xiàn)復(fù)雜的查詢。”——其實我對 SQL 不太熟悉,大家谷歌下其意思即可。

怎么用 CTE 呢?我們用小巧數(shù)據(jù)庫 SQLite,它就支持!別看他體積不大,卻也能支持最新 SQL99 的 with 語句,例子如下。 

WITH w1( id, parentId, name) AS (		SELECT 			category.id, 			category.parentId,             category.name		FROM 			category 		WHERE 			id = 1	UNION ALL 		SELECT 			category.id, 			category.parentId,             category.name		FROM 			category JOIN w1 ON category.parentId= w1.id) 

SELECT * FROM w1;其中 WHERE id = 1 是那個父節(jié)點之 id,你可以改為你的變量。簡單說,遞歸 CTE 最少包含兩個查詢(也被稱為成員)。第一個查詢?yōu)槎c成員,定點成員只是一個返回有效表的查詢,用于遞歸的基礎(chǔ)或定位點。第二個查詢被稱為遞歸成員,使該查詢稱為遞歸成員的是對 CTE 名稱的遞歸引用是觸發(fā)。在邏輯上可以將 CTE 名稱的內(nèi)部應(yīng)用理解為前一個查詢的結(jié)果集。遞歸查詢沒有顯式的遞歸終止條件,只有當?shù)诙€遞歸查詢返回空結(jié)果集或是超出了遞歸次數(shù)的最大限制時才停止遞歸。遞歸次數(shù)上限的方法是使用 MAXRECURION。

SQL,雙親節(jié)點

 

相應(yīng)地給出查找所有父節(jié)點的方法(獲取祖先 Ancestors,就是把 id 和 parentId 反過來)

WITH w1( id, parentId, name, level) AS  (    SELECT          id,          parentId,          name,        0 AS level      FROM          category        WHERE          id = 6     UNION ALL        SELECT          category.id,          category.parentId,          category.name ,        level + 1      FROM          category JOIN w1 ON category.id= w1.parentId )  SELECT * FROM w1; 

無奈的 MySQL

SQLite ok 了,而 MySQL 呢?

在另一邊廂,大家都愛用的 MySQL 卻無視 with 語句,官網(wǎng)博客上明確說明是壓根不支持,十分不方便,明明可以很簡單事情為什么不能用呢?——而且 MySQL 也好像沒有計劃在將來的新版本中添加 with 的 cte 功能。于是大家想出了很多辦法。其實不就是一個遞歸程序么——應(yīng)該不難——寫函數(shù)或者存儲過程總該行吧?沒錯,的確如此,——寫遞歸不是問題,問題是用 SQL 寫就是個問題——還是那句話,“隔行如隔山”,雖然有點夸張的說法,但我想既懂數(shù)據(jù)庫又懂各種數(shù)據(jù)庫方言寫法(存儲過程)的人應(yīng)該不是很多吧~,——不細究了,反正就是代碼帖來貼去唄~

我這里就不貼 SQL 了,可以看這里的,《MySQL中進行樹狀所有子節(jié)點的查詢》

至此,我們的目的可以說已經(jīng)達到了,而且還不錯,因為這是不限層數(shù)的(以前 CMS 常說的“無限級”分類)。——其實,一般情況下,層數(shù)超過三層就很多,很復(fù)雜了,一般用戶如無特殊需求,也用不上這么多層。于是,在給定層數(shù)的約束下,可以寫標準的 SQL 來完成該任務(wù)——盡管有點寫死的感覺~~

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4FROM category AS t1LEFT JOIN category AS t2 ON t2.parentId = t1.idLEFT JOIN category AS t3 ON t3.parentId = t2.idLEFT JOIN category AS t4 ON t4.parentId = t3.idWHERE t1.id= 1

SQL,雙親節(jié)點

 

相應(yīng)地給出查找所有父節(jié)點的方法(獲取祖先 Ancestors,就是把 id 和 parentId 反過來)

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4  
FROM category AS t1  
 LEFT JOIN category AS t2 ON t2.id= t1.parentId 
 LEFT JOIN category AS t3 ON t3.id= t2.parentId 
 LEFT JOIN category AS t4 ON t4.id= t3.parentId

WHERE t1.id= 10優(yōu)化版本

但是生成的結(jié)果和第一個例子相比起來有點奇怪,而且不好給 Java 用,——那就再找找其他例子

SELECT    
            p1.id,
            p1.name,
            p1.parentId as parentId,
            p2.parentId as parent2_id,
            p3.parentId as parent3_id,
            p4.parentId as parent4_id,
            p5.parentId as parent5_id,
   p6.parentId as parent6_id
FROM category p1
LEFT JOIN   category p2 on p2.id = p1.parentId 
LEFT JOIN   category p3 on p3.id = p2.parentId 
LEFT JOIN   category p4 on p4.id = p3.parentId  
LEFT JOIN   category p5 on p5.id = p4.parentId  
LEFT JOIN   category p6 on p6.id = p5.parentId
WHERE 1 IN   (p1.parentId, 
                   p2.parentId, 
                   p3.parentId, 
                   p4.parentId, 
                   p5.parentId, 
                   p6.parentId)

ORDER BY 1, 2, 3, 4, 5, 6, 7; 這個總算像點樣子了,結(jié)果是這樣子的。

SQL,雙親節(jié)點

 

相應(yīng)地給出查找所有父節(jié)點的方法(獲取祖先 Ancestors,就是把 id 和 parentId 反過來, 還有改改 IN 里面的字段名) 

SELECT           p1.id,         p1.name,         p1.parentId as parentId,         p2.parentId as parent2_id,         p3.parentId as parent3_id  FROM  category p1   LEFT JOIN  category p2 on p2.parentId  = p1.id  LEFT JOIN  category p3 on p3.parentId  = p2.id  WHERE 9 IN  (p1.id,              p2.id,              p3.id)    ORDER BY 1, 2, 3; 

這樣就很通用啦~無論你 SQLite 還是 MySQL。

其他查詢:

查詢直接子節(jié)點的總數(shù):

SELECT c.*,    (SELECT COUNT(*) FROM category c2 WHERE c2.parentId = c.id)     AS direct_childrenFROM category c

•使用 with 語句遞歸,通俗易懂的例子(英文),我第一個成功的例子就是從這里 copy 的,另外還可以查層數(shù) level 和反向的父節(jié)點:https://www.valentina-db.com/dokuwiki/doku.php?id=valentina:articles:recursive_query

•標準寫法的出處(英文):http://stackoverflow.com/questions/20215744/how-to-create-a-mysql-hierarchical-recursive-query

•很好的總結(jié)貼(英文):http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

•SQlite with 語句用法中文翻譯(太晦澀,不懂鳥) http://blog.csdn.net/aflyeaglenku/article/details/50978986

•利用閉包做的樹結(jié)構(gòu)(書上說這個方法最好,但同時覺得也很高級,英文)http://charlesleifer.com/blog/querying-tree-structures-in-sqlite-using-python-and-the-transitive-closure-extension/

以上這篇SQL 雙親節(jié)點查找所有子節(jié)點的實現(xiàn)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網(wǎng)。



注:相關(guān)教程知識閱讀請移步到MSSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
亚洲欧美日韩国产综合| 欧美videossex| 国产在线导航| 国产一区一区三区| 亚洲欧美一区二区三区国产精品| 久久久影院一区二区三区| 欧美艾v福利视频在线观看| 国产真人做爰毛片视频直播| 91成人在线播放| 中文字幕+乱码+中文乱码www| 粉嫩av在线播放| 老司机福利在线视频| 免费一级做a爰片久久毛片潮| 国产成人无码一区二区三区在线| 一区二区冒白浆视频| 在线视频国内自拍亚洲视频| 久久人体视频| 亚洲深夜福利| 3d精品h动漫啪啪一区二区| 精品免费国产| 30一40一50老女人毛片| jizz亚洲女人高潮大叫| 久久久99精品免费观看| 欧美狂野激情性xxxx在线观| 中文字幕中文在线| 国产精品激情| 国产一区二区三区观看| 午夜婷婷在线观看| 国产精品视频一区二区图片| 香蕉视频在线免费| 国产成人精品在线| 性金发美女69hd大尺寸| 亚洲国产日韩欧美一区二区三区| 国内精品400部情侣激情| 日韩av综合| 九九久久九九| 蜜桃久久av一区| 男女男精品视频网站| 亚洲国产精彩中文乱码av在线播放| 深爱激情综合网| 国模大尺度视频一区二区| 成人免费a视频| 欧美三级一区| 欧美精品videos另类日本| 国内精品久久久久久久| 国产精品理人伦一区二区三区| www国产成人| 精品中文字幕在线观看| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美色成人综合| 无码人妻av免费一区二区三区| 一二三四社区在线视频6| 国产精品jizz在线观看美国| 丁香激情五月婷婷| 欧洲亚洲一区二区三区四区五区| 大量国产精品视频| 公共露出暴露狂另类av| 生活片a∨在线观看| 国产精品日韩精品| 日韩av片免费在线观看| 美女流白浆视频| 国产乱淫片视频| 亚洲欧美亚洲| 99精品欧美一区二区三区综合在线| 一区二区三区精品| 国产精品视频首页| 亚洲午夜电影在线观看| 日韩午夜精品| 中文字幕免费在线看| 九色视频在线观看免费播放| 日本免费成人| 亚洲综合在线小说| 人妻体内射精一区二区三区| 欧美特级黄色录像| 一区二区精品在线| 在线视频精品| 91免费在线视频网站| 免费看国产一级片| 久久国产美女视频| 伊人久久婷婷色综合98网| 草久在线视频| 亚洲天堂第一页| 7788色淫网站小说| 国产精品秘入口| 丝袜 亚洲 另类 欧美 重口| 91欧美日韩一区| 国产精品免费看久久久无码| 高清不卡一区| 免费看成年人视频| 久久全国免费久久青青小草| 国产日韩欧美一区二区三区在线观看| 日本午夜精品视频| 精品176极品一区| 性一交一乱一伧老太| 最新不卡av在线| 亚洲综合五月天| 欧美日韩的一区二区| av网站免费大全| 成品网站w灬+源码1688网页| 66av国产| 久色乳综合思思在线视频| 我爱我色成人网| 免费一级suv好看的国产网站| 亚洲成人高清| 欧美日韩中文| 精品久久人人做人人爰| 午夜免费福利影院| 艳妇乳肉豪妇荡乳xxx| 色婷婷在线影院| 欧美黄色成人网| 131美女爱做视频| 午夜精品影院在线观看| 国产三级伦理片| 日韩一区中文字幕| 在线影院av| 日韩av中文| 在线亚洲欧美| 亚洲高清一区二| 欧美成人一区二区三区四区| 一区二区视频免费在线观看| 影音先锋久久资源网| 欧美无砖专区免费| 国产情侣在线视频| 中文字幕在线观看不卡| 夜夜精品浪潮av一区二区三区| 久热在线中文字幕色999舞| 久久99久久99小草精品免视看| 污污的视频免费观看| 91中文字幕在线| 天天干 天天插| 国产黄色成人av| 久久久久久久久久伊人| 国产免费一区二区三区视频| 国产av一区二区三区| 91成人在线精品视频| 国产99视频在线观看| 天天摸天天碰天天爽天天弄| 亚洲成人黄色影院| 一级特黄曰皮片视频| 国产理论片免费观看| 日韩欧美中文字幕一区二区| 猛男gaygay欧美视频| 欧美va在线播放| 一区二区视频免费在线观看| 亚洲va电影大全| 欧美精品尤物在线观看| 99视频在线免费| 最新成人av网站| 国内拍拍自拍视频在线观看| 日韩成人在线资源| 欧美在线不卡视频| 夜夜嗨av一区二区三区网站四季av| 全部免费的黄色毛片| 国产精品区一区二区三| 中文字幕在线日韩| 成人app下载| 国产精品久久久久久久第一福利| 日本一区二区在线看| 91免费观看视频在线| 久草在线在线精品观看| 欧美videossex另类| 丁香啪啪综合成人亚洲小说| luxu259在线中文字幕| 久久不射2019中文字幕| 人妻无码久久一区二区三区免费| 欧美二区乱c黑人| 毛片网站大全| 中文在线√天堂| japanese国产精品| 一二三四社区在线视频| 国产69久久| 国产乱精品一区二区三区| 在线不卡日本v二区707| 五月亚洲婷婷| xxxx一级片| 4kfree性满足欧美hd18| 国产又黄又爽又无遮挡| 在线视频你懂| 国产免费美女视频| 欧美精品一区二区三区在线四季| 欧美亚洲在线日韩| 米奇777在线影院线| 欧美久久久久久久久| 波多野结衣一区二区三区免费视频| 成人福利一区| 欧美v日韩v国产v| 精品一区二区三区国产| 国产在线观看91一区二区三区| 999视频在线免费观看| 欧美与亚洲与日本直播| 久久久久久久久网| 国产传媒欧美日韩| 中文字幕免费一区二区| 欧美极品欧美精品欧美视频| 在线观看亚洲视频| 国产亚洲欧美一区在线观看| 国产黄色片在线| 一个人看的www视频免费在线观看| 午夜欧美大尺度福利影院在线看| 美日韩一二三区| 96精品久久久久中文字幕| 欧美精品成人| 日韩久久一区二区| 久久免费一级片| 久久综合激情| 无码人妻久久一区二区三区蜜桃| 久久久久久久久久久99| 福利一区视频在线观看| 国产精品精品久久久| 88av看到爽| 国产精品国产自产拍高清av水多| 免费日韩电影| 熟女少妇内射日韩亚洲| 中文一区一区三区免费在线观看| xxxxxhd亚洲人hd| 国产一区二区三区免费观看在线| 18av千部影片| 国精产品乱码一区一区三区四区| 国产传媒久久文化传媒| 红桃视频欧美| 波多野结衣视频免费观看| 成人精品久久av网站| 丁香在线视频| 97视频人免费观看| 日韩精品亚洲专区在线观看| 四川一级毛毛片| 桃花岛tv亚洲品质| 亚洲欧美tv| 最新国产在线视频| 1卡2卡3卡精品视频| 在线免费黄色av| 国产一级性片| 99精品欧美一区二区三区综合在线| 日韩电影中文字幕| 欧美日韩国产激情| 日韩欧美在线视频免费观看| 色婷婷综合五月| 日韩精品免费一区二区三区| 露脸国产精品自产在线播| 91女人18毛片水多国产| 美女的尿口免费视频| 亚洲欧美日韩国产成人综合一二三区| 国模一区二区| 亚洲综合小说图片| 99高清免费国产自产拍| 香蕉视频一区| 自拍亚洲欧美老师丝袜| 懂色av粉嫩av蜜臀av| 在线免费看av的网站| 搡老熟女老女人一区二区| 久久人人超碰| 视频在线这里都是精品| 97中文在线| 亚洲高潮女人毛茸茸| 久久亚洲天堂| 日韩在线视频免费看| 国产精品91一区二区三区| 韩国三级丰满少妇高潮| 亚洲最新合集| 2014亚洲天堂| 成人av网站免费观看| 一区二区三区在线免费看| 日韩成人在线观看| 永久免费av在线| 色综合一本到久久亚洲91| 天天综合网天天综合| 国产艳俗歌舞表演hd| 成人av手机在线观看| 日本不卡高清视频一区| 少妇人妻一区二区| 成人免费网站视频www| 一区二区三区自拍| 久久久久久欧美精品se一二三四| 国产情侣第一页| 国产91久久久久| 娇小发育未年成性色xxx8| 99精品久久免费看蜜臀剧情介绍| 亚洲精品乱码久久久久久自慰| 丰满人妻一区二区三区免费视频棣| 国产免费黄视频在线观看| 日干夜干天天干| av网站在线播放| 91免费视频观看| 亚洲欧美一区二区三区久本道91| 在线激情小视频| 久久久久久久国产精品| www黄色在线观看| y4480在线8影院| 久久伊人成人网| 尤物网在线观看| 成人动漫在线观看视频| 色女人在线视频| 日韩激情毛片| 91免费精品| 又色又爽又高潮免费视频国产| 一区二区在线影院| 欧美日韩aaaaaa| 久久久久www| 中文字幕剧情在线观看| 国产成人精品无码片区在线| 日日摸夜夜爽人人添| 国产一区二区三区四区五区| 182在线视频观看| 国产日本一区二区| 欧美成人激情视频免费观看| 欧美日韩一区二区国产| 天堂社区在线视频| 精品人妻少妇AV无码专区| 国精产品一区一区二区三区mba| 国产成人免费在线观看| 麻豆一区二区在线观看| 国产精品77777| 九色丨porny丨| 中文在线免费一区三区高中清不卡| 国产精品久久久久久久精| 丝袜a∨在线一区二区三区不卡| 无码人妻丰满熟妇区96| 69堂成人精品免费视频| 亚洲精品成人无码熟妇在线| 狠狠躁日日躁夜夜躁av| 猫咪成人在线观看| 国产偷人妻精品一区| 乳奴隷乳フ辱julia在线观看| 麻豆精品在线播放| 7799精品视频| 台湾佬中文在线| 日本不卡在线观看| 国产主播性色av福利精品一区|