SQL Server 根據樹狀結構表生成以/號分割的路由字串
阿新 • • 發佈:2018-11-23
很多情況下,我們有必要把樹形結構進行資料梳理。比如,要方便的過濾出一個父節點下的所有子節點等等。。。
這個時候,我們可以生成一個路徑表字符串,在應用時只需要對該字串進行索引即可達成目的。
目標:按圖示的部門結構樹,獲取本身的完整路徑字串。比如,前道工序部門,其部門程式碼為PDTE,上級部門為PD生產部,按結構樹獲取到一個/PD/PDTE/的字串。
先來一個簡單點的展示:
WITH T AS (SELECT CAST('/' + DeptCode + '/' AS NVARCHAR(MAX)) AS DpPath, DeptRKEY AS DpKey FROM Base_Department WHERE (ILevel = 1)--指定父級起點 UNION ALL SELECT CAST(t.DpPath + D.DeptCode + '/' AS NVARCHAR(MAX)) AS DpPath, D.DeptRKEY AS DpKey FROM Base_Department AS D INNER JOIN T ON D.ParentRKEY = T.DpKey)--設定遞迴關聯 SELECT DpPath, DpKey FROM T--輸出結果
輸出如下圖:
然後開個稍微複雜點的,帶上級機構關聯上:
WITH T AS (SELECT '/' + CAST(DeptCode AS NVARCHAR(MAX)) + '/' AS DpPath, DeptRKEY AS DpKey, DeptNameLL AS DpNameLL, DeptNameLI AS DpNameLI, ILevel AS DpLevel, ISEQ AS DpSEQ, BranchRKEY FROM Base_Department WHERE (ILevel = 1) UNION ALL SELECT CAST(t.DpPath + D.DeptCode + '/' AS NVARCHAR(MAX)) AS DpPath, D.DeptRKEY AS DpKey, D.DeptNameLL AS DpNameLL, D.DeptNameLI AS DpNameLI, D.ILevel AS DpLevel, D.ISEQ AS DpSEQ, D.BranchRKEY FROM Base_Department AS D INNER JOIN T ON D.ParentRKEY = T.DpKey) SELECT '/' + BranchCode + '/' AS DpPath, BranchCode AS DpKey, BranchNameLL AS DpNameLL, BranchNameLI AS DpNameLI, 0 AS DpLevel, 0 AS DpSEQ FROM Base_Branch UNION ALL SELECT '/' + B.BranchCode + T.DpPath AS Expr1, STR(T.DpKey) AS DpKey, T.DpNameLL, T.DpNameLI, T.DpLevel, T.DpSEQ FROM T INNER JOIN Base_Branch AS B ON T.BranchRKEY = B.BranchRKEY
輸出如下:
如果,某些場合下,就能很好的利用這個DpPath了。