SQL如何求解递归问题?

简介: SQL数据库开发

递归

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


问题

有如下一张表City,

36.jpg


希望得到如下结果

37.jpg


该如何写这个查询?


问题分析

我们从上面的问题中发现,省市区全部在同一列中,而他们的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里面的内容

38.jpg

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


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


结果如下:

39.png

这样问题就解决了,感兴趣的小伙伴可以动手试一下。



相关文章
|
5月前
|
SQL 分布式计算 MaxCompute
odps sql 怎么实现递归查询?
odps sql 怎么实现递归查询?
374 1
|
6月前
|
SQL 存储 分布式计算
ODPS怎么实现SQL中的多层递归?
ODPS怎么实现SQL中的多层递归?
224 1
|
7月前
|
SQL Oracle 关系型数据库
oracle中sql的递归查询运用
oracle中sql的递归查询运用
|
9月前
|
SQL 关系型数据库 数据库
10个高级SQL写法,包括窗口函数、联合查询、交叉查询、递归查询
10个高级SQL写法,包括窗口函数、联合查询、交叉查询、递归查询
167 1
【Sql Server】with as 递归查询的简单使用 以及在视图工具下的使用 注意小事项一
with as 递归查询的简单使用 以及在视图工具下的使用 注意小事项一
196 0
【Sql Server】with as 递归查询的简单使用 以及在视图工具下的使用 注意小事项一
|
SQL 存储 移动开发
PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(四)|学习笔记
快速学习3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(四)
382 0
 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(四)|学习笔记
|
SQL 关系型数据库 数据库
3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(三)|学习笔记
快速学习3 PostgreSQL psql的使用,SQL语法,数据类型,递归SQL用法(三)
304 0
|
SQL
SQL面试题:类递归计算
最近遇到一个比较有意思的SQL题,看似需要使用递归计算,其实不然,可以使用窗口函数解决
322 0
|
SQL 数据库