SQL如何求解省市区中的递归问题?
创始人
2025-07-05 11:00:15
0

递归

递归是指程序调用自身的一种编程技巧,在SQL中也有递归查询。下面我们通过一个省市区的示例来讲解递归查询的用法。

问题

有如下一张表City,

图片图片

希望得到如下结果

图片图片

该如何写这个查询?

问题分析

我们从上面的问题中发现,省市区全部在同一列中,而他们的ParentID有某种联系。仔细看市一级的ParentID正好是省的ID,而区一级的ParentID正好是市的ID,这完全符合我们递归定义。

示例代码

根据我们上面的分析我们先写出递归部分

--递归部分
;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里面的内容

图片图片

然后我们只需要将省市区一一列出来即可,注意下面的这段代码要和上面的递归部分一起执行。

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

结果如下:

图片图片

感兴趣的小伙伴可以动手试一下。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...