点击上方SQL数据库开发,关注获取SQL视频教程
SQL专栏
递归
递归是指程序调用自身的一种编程技巧,在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;
(提示:可以左右滑动代码)
(其中递归的具体用法可以看我们之前发布的内容《SQL高级知识V2——递归查询》)
递归查询写完后,可以查看一下递归部分CTE里面的内容

然后我们只需要将省市区一一列出来即可,注意下面的这段代码要和上面的递归部分一起执行。
SELECT t1.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

——End—— 后台回复关键字:1024,获取一份精心整理的技术干货 后台回复关键字:进群,带你进入高手如云的交流群。 推荐阅读
SQL 查询优化之 WHERE 和 LIMIT 使用索引的奥秘 MySQL主从复制配置详解 神奇的 SQL,GROUP BY 真扎心,原来是这样! 为什么阿里巴巴禁止使用存储过程? 同事给我埋了个坑:INSERT INTO SELECT把生产服务器炸了
这是一个能学到技术的公众号,欢迎关注
点击「阅读原文」了解SQL训练营最后修改时间:2020-05-09 09:30:19
文章转载自SQL数据库开发,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




