SQL如何求解省市区中的递归问题?

SQL数据库开发

共 2599字,需浏览 6分钟

 · 2023-11-08

点击关注公众号,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.parentIdINNER JOIN(SELECT * FROM CTE WHERE LEVEL=3) AS t3 ON t2.id=t3.parentIdORDER BY 1,2,3


结果如下:


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


    
    

最后给大家分享我写的SQL两件套:《SQL基础知识第二版》《SQL高级知识第二版》的PDF电子版。里面有各个语法的解释、大量的实例讲解和批注等等,非常通俗易懂,方便大家跟着一起来实操。


有需要的读者可以下载学习,在下面的公众号「数据前线」(非本号)后台回复关键字:SQL,就行

数据前线


后台回复:1024,获取一份精心整理的技术干货

后台回复:进群,带你进入高手如云的交流群。

        
        

推荐阅读

          
          
          
          

浏览 888
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报