postgresql 递归查询,查询父子节点关联关系

递归

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

问题

有如下一张表City,
postgresql 递归查询,查询父子节点关联关系_第1张图片
希望得到如下结果

在这里插入图片描述

该如何写这个查询?
问题分析

我们从上面的问题中发现,省市区全部在同一列中,而他们的ParentID有某种联系。仔细看市一级的ParentID正好是省的ID,而区一级的ParentID正好是市的ID,这完全符合我们递归定义。

示例代码

根据我们上面的分析我们先写出递归部分

WITH RECURSIVE CTE(id,name,parentid,level) 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里面的内容

postgresql 递归查询,查询父子节点关联关系_第2张图片

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

WITH RECURSIVE CTE(id,name,parentid,level) 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 
    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;

你可能感兴趣的:(postgresql,数据库)