SQL如何求解省市区中的递归问题?
SQL数据库开发
共 2599字,需浏览 6分钟
·
2023-11-08 07:14
点击关注公众号,SQL干货及时获取
后台回复:1024,获取海量学习资源 SQL刷题专栏 SQL145题系列
大家注意:
因为微信改了推送机制,会有小伙伴刷不到当天的文章,
一些比较实用的知识和信息,错过了就是错过了。
所以建议大家加个星标,就能第一时间收到推送了。
递归
递归是指程序调用自身的一种编程技巧,在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
结果如下:
感兴趣的小伙伴可以动手试一下。
最后给大家分享我写的SQL两件套:《SQL基础知识第二版》和《SQL高级知识第二版》的PDF电子版。里面有各个语法的解释、大量的实例讲解和批注等等,非常通俗易懂,方便大家跟着一起来实操。
有需要的读者可以下载学习,在下面的公众号「数据前线」(非本号)后台回复关键字:SQL,就行
数据前线
后台回复:1024,获取一份精心整理的技术干货
后台回复:进群,带你进入高手如云的交流群。
推荐阅读
评论