SQL如何求解省市區(qū)中的遞歸問題?
點(diǎn)擊關(guān)注公眾號,SQL干貨及時獲取
后臺回復(fù):1024,獲取海量學(xué)習(xí)資源
SQL刷題專欄
SQL145題系列
大家注意:
因為微信改了推送機(jī)制,會有小伙伴刷不到當(dāng)天的文章,
一些比較實用的知識和信息,錯過了就是錯過了。
所以建議大家加個星標(biāo)
,就能第一時間收到推送了。

遞歸
遞歸是指程序調(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=0UNION ALLSELECT t.id,t.NAME,t.parentId,cte.Level+1 AS Level FROM City tJOIN CTE ON t.parentId=CTE.id)SELECT * FROM CTE;
(提示:可以左右滑動代碼)
遞歸查詢寫完后,可以查看一下遞歸部分CTE里面的內(nèi)容

然后我們只需要將省市區(qū)一一列出來即可,注意下面的這段代碼要和上面的遞歸部分一起執(zhí)行。
SELECTt1.name AS [一級地名],t2.name AS [二級地名],t3.name AS [三級地名]FROM(SELECT * FROM CTE WHERE LEVEL=1) AS t1INNER JOIN(SELECT * FROM CTE WHERE LEVEL=2) AS t2 ON t1.id=t2.parentIdINNER JOIN(SELECT * FROM CTE WHERE LEVEL=3) AS t3 ON t2.id=t3.parentIdORDER BY 1,2,3
結(jié)果如下:

感興趣的小伙伴可以動手試一下。
最后給大家分享我寫的SQL兩件套:《SQL基礎(chǔ)知識第二版》和《SQL高級知識第二版》的PDF電子版。里面有各個語法的解釋、大量的實例講解和批注等等,非常通俗易懂,方便大家跟著一起來實操。
有需要的讀者可以下載學(xué)習(xí),在下面的公眾號「數(shù)據(jù)前線」(非本號)后臺回復(fù)關(guān)鍵字:SQL,就行
數(shù)據(jù)前線
后臺回復(fù):1024,獲取一份精心整理的技術(shù)干貨
后臺回復(fù):進(jìn)群,帶你進(jìn)入高手如云的交流群。
推薦閱讀
SQL中的時間重疊問題 避免 MySQL 插入重復(fù)數(shù)據(jù)的 4 種方式,還有誰不會?! Redis 官方可視化工具,高顏值,功能真心強(qiáng)大! 經(jīng)典SQL語句大全 SQL中的郵件配置!
![]()

