SQL如何求解省市區(qū)中的遞歸問題?
遞歸
遞歸是指程序調(diào)用自身的一種編程技巧,在SQL中也有遞歸查詢。下面我們通過一個省市區(qū)的示例來講解遞歸查詢的用法。
問題
有如下一張表City,
圖片
希望得到如下結(jié)果
圖片
該如何寫這個查詢?
問題分析
我們從上面的問題中發(fā)現(xiàn),省市區(qū)全部在同一列中,而他們的ParentID有某種聯(lián)系。仔細(xì)看市一級的ParentID正好是省的ID,而區(qū)一級的ParentID正好是市的ID,這完全符合我們遞歸定義。
示例代碼
根據(jù)我們上面的分析我們先寫出遞歸部分
--遞歸部分
;WITH CTE AS (
SELECT ID,NAME,ParentId,1 AS Level FROM City WHERE parentId=0
UNION ALL
SELECT t.id,t.NAME,t.parentId,cte.Level+1 AS Level FROM City t
JOIN CTE ON t.parentId=CTE.id
)
SELECT * FROM CTE;
遞歸查詢寫完后,可以查看一下遞歸部分CTE里面的內(nèi)容
圖片
然后我們只需要將省市區(qū)一一列出來即可,注意下面的這段代碼要和上面的遞歸部分一起執(zhí)行。
SELECT
t1.name AS [一級地名]
,t2.name AS [二級地名]
,t3.name AS [三級地名]
FROM
(SELECT * FROM CTE WHERE LEVEL=1) AS t1
INNER JOIN
(SELECT * FROM CTE WHERE LEVEL=2) AS t2 ON t1.id=t2.parentId
INNER JOIN
(SELECT * FROM CTE WHERE LEVEL=3) AS t3 ON t2.id=t3.parentId
ORDER BY 1,2,3
結(jié)果如下:
圖片
感興趣的小伙伴可以動手試一下。