SQL Server遞歸查詢
1、既然要談到sql,數(shù)據(jù)庫(kù)表是必須的
?
2、數(shù)據(jù)結(jié)構(gòu)
? ?
3、獲取某個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)
? ? 傳統(tǒng)的寫法(sql2000) 很麻煩,暫且就不寫了
? ? 來(lái)看看CTE的寫法
CREATE?PROC?sp_getTreeById(@TreeId?int)?AS? BEGIN? WITH?cteTree?AS ??(SELECT?* ???FROM?TuziTree ???WHERE?Id?=?@TreeId?--第一個(gè)查詢作為遞歸的基點(diǎn)(錨點(diǎn)) ?UNION?ALL ?SELECT?TuziTree.*?--第二個(gè)查詢作為遞歸成員,?下屬成員的結(jié)果為空時(shí),此遞歸結(jié)束。 ?FROM?cteTree ?INNER?JOIN?TuziTree?ON?cteTree.Id?=?TuziTree.ParentId ??)?SELECT?*?FROM?cteTree? END
試一下啊 ?
?exec??sp_getTreeById??@TreeId=1001
結(jié)果
-----------------------------------------------
4、使用節(jié)點(diǎn)路徑來(lái)做(每個(gè)節(jié)點(diǎn)路徑都保存自身的路徑和所有父節(jié)點(diǎn)的路徑=自己和所有父節(jié)點(diǎn)的關(guān)聯(lián))
? ?
5、既然有個(gè)路徑
? 那么查詢其所有子節(jié)點(diǎn) 只需要 where nodePath like '/1001/%'了
? 這樣就會(huì)簡(jiǎn)單很多,加上索引。
總結(jié):
??如果在性能的需要上,我們可以采用按需加載,點(diǎn)擊節(jié)點(diǎn)時(shí)候 才會(huì)加載其所有子節(jié)點(diǎn)。
? 如果在變化不大的情況下,可以采用緩存?。這樣的處理 可以滿足很多業(yè)務(wù)需求。
? 良好的表設(shè)計(jì)會(huì)給后期的開發(fā)以及需求變化 帶來(lái)更多的便利。