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;

递归查询写完后,可以查看一下递归部分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数据库开发
相关推荐

2021-04-25 09:42:40

SQL递归SQL Server

2021-08-03 07:40:47

SQL年份语句

2020-12-03 15:00:47

区块链互联网

2023-08-29 09:46:12

SQLCTE递归

2020-04-24 12:48:01

新基建物联网IOT

2022-03-15 08:36:46

递归查询SQL

2020-03-05 12:22:07

物联网基建IOT

2021-08-12 07:49:24

SQL递归用法

2020-03-06 16:57:24

基建GDP

2021-09-10 18:47:20

华为人工智能

2010-10-11 09:05:40

SQL Server

2021-11-09 06:55:03

SQLServer排序

2021-04-09 10:37:40

SQL Server数据库排名

2010-06-11 09:13:20

openSUSE 网卡

2010-06-11 13:05:41

openSUSE视频

2011-08-19 14:38:22

SQL Server 2008递归查询

2021-11-19 08:12:45

SQL重叠数据

2010-06-09 13:03:00

Opensuse分区

2009-05-26 10:21:07

点赞
收藏

51CTO技术栈公众号