PostgreSQL 递归查询(含层级和结构)

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: PostgreSQL 递归查询(含层级和结构)

🏆 文章目标:整理PostgreSQL 递归查询的方式,方便自己和大家快速查看。

🍀 PostgreSQL 递归查询(含层级和结构)

✅ 创作者:Jay…

🎉 个人主页:Jay的个人主页

🍁 展望:若本篇讲解内容帮助到您,请帮忙点个赞吧,您的支持是我继续写作的最大动力,谢谢。🙏

背景

父子关系的表中,避免不了相关正向查询,和反向查询的业务逻辑。

  • 根据已知的“父对象”,递归查询所有的子级对象。
  • 根据已知的“子对象”,递归查询所有的父级对象。
  • 根据已知的“子对象/父对象”,递归查询所有的父级对象/子对象,并带有层级和结构。

对于第三点业务需求,PostgreSQL默认没有类似于Oracle的关键字“Level”,如果需要获取层级,需要自行构建,或者通过安装cross这个脚本来进行扩展(cross脚本处于安装目录,具体位置自行百度)。

实践

准备数据

创建表

create table city(id varchar(3) , pid varchar(3) , name varchar(10));

插入数据

insert into city values('002' , 0 , '浙江省'); 
insert into city values('001' , 0 , '广东省'); 
insert into city values('003' , '002' , '衢州市');  
insert into city values('004' , '002' , '杭州市') ; 
insert into city values('005' , '002' , '湖州市');  
insert into city values('006' , '002' , '嘉兴市') ; 
insert into city values('007' , '002' , '宁波市');  
insert into city values('008' , '002' , '绍兴市') ; 
insert into city values('009' , '002' , '台州市');  
insert into city values('010' , '002' , '温州市') ; 
insert into city values('011' , '002' , '丽水市');  
insert into city values('012' , '002' , '金华市') ; 
insert into city values('013' , '002' , '舟山市'); 
insert into city values('014' , '004' , '上城区') ; 
insert into city values('015' , '004' , '下城区');  
insert into city values('016' , '004' , '拱墅区') ; 
insert into city values('017' , '004' , '余杭区') ; 
insert into city values('018' , '011' , '金东区') ; 
insert into city values('019' , '001' , '广州市') ; 
insert into city values('020' , '001' , '深圳市') ;
insert into city values('021' , '013' , '普陀区');

业务实践

根据已知的“父对象” - > “浙江省”,递归查询所有的子级对象。

SQL:

WITH RECURSIVE cte AS 
( 
SELECT id, name, pid FROM city WHERE id = '002'
UNION ALL  
SELECT child.id, child.name, child.pid FROM city child INNER JOIN cte parent ON parent.id = child.pid 
)
SELECT * FROM cte

结果:

根据已知的“子对象” - “普陀区”,递归查询所有的父级对象。

SQL:

WITH RECURSIVE cte AS 
( 
SELECT id, name, pid FROM city WHERE id = '021'
UNION ALL  
SELECT parent.id, parent.name, parent.pid FROM city parent INNER JOIN cte child ON parent.id = child.pid 
)
SELECT * FROM cte

结果:

根据已知的“子对象” - “普陀区”,递归查询所有的父级对象,并带有层级和结构。

SQL:

WITH RECURSIVE cte AS 
( 
SELECT id, name, pid, name::varchar(150) as combined_name, id::varchar(150) AS combined_id, 1 AS LEVEL 
FROM city WHERE id = '021'
UNION ALL
  
SELECT parent.id, parent.name, parent.pid, (child.combined_name || '>' || parent.name)::varchar(150) AS combined_name, 
(child.combined_id || '>' || parent.id)::varchar(150) AS combined_id, child.LEVEL + 1 AS LEVEL 
FROM city parent INNER JOIN cte child ON parent.id = child.pid 
)
SELECT * FROM cte

结果:

跨层级反查时,可以考虑利用组合的id或者名称作为入口。

FAQ

1、ERROR: recursive query “t” column 2 has type character varying(150) in non-recursive term but type character varying overall

针对拼接的字段,需要重新定义其数据类型及长度。参考如下:

关注公众号:熊猫Jay字节之旅,了解更多 AI 技巧 ~

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
消息中间件 存储 关系型数据库
PostgreSQL技术大讲堂 - 第33讲:并行查询管理
PostgreSQL从小白到专家,技术大讲堂 - 第33讲:并行查询管理
462 1
|
6月前
|
存储 关系型数据库 数据库
postgresql|数据库|提升查询性能的物化视图解析
postgresql|数据库|提升查询性能的物化视图解析
649 0
|
6月前
|
存储 SQL 人工智能
01-PostgreSQL 存储过程的基本介绍以及入门(基本结构、声明和赋值、控制结构)(下)
01-PostgreSQL 存储过程的基本介绍以及入门(基本结构、声明和赋值、控制结构)
|
关系型数据库 C语言 PostgreSQL
PostgreSQL服务端开发学习 --- 常用结构及宏定义1
本篇主要讲解使用C语言开发PostgreSQL服务端应用(libpq、自定义函数、扩展)常用到的结构及宏定义。
|
17天前
|
SQL 关系型数据库 数据库
PostgreSQL性能飙升的秘密:这几个调优技巧让你的数据库查询速度翻倍!
【10月更文挑战第25天】本文介绍了几种有效提升 PostgreSQL 数据库查询效率的方法,包括索引优化、查询优化、配置优化和硬件优化。通过合理设计索引、编写高效 SQL 查询、调整配置参数和选择合适硬件,可以显著提高数据库性能。
108 1
|
3月前
|
缓存 关系型数据库 数据库
PostgreSQL 查询性能
【8月更文挑战第5天】PostgreSQL 查询性能
75 8
|
5月前
|
SQL 关系型数据库 数据库
Python执行PostgreSQL数据库查询语句,并打印查询结果
本文介绍了如何使用Python连接和查询PostgreSQL数据库。首先,确保安装了`psycopg2`库,然后创建数据库连接函数。接着,展示如何编写SQL查询并执行,例如从`employees`表中选取所有记录。此外,还讨论了处理查询结果、格式化输出和异常处理的方法。最后,提到了参数化查询和事务处理以增强安全性及确保数据一致性。
Python执行PostgreSQL数据库查询语句,并打印查询结果
|
4月前
|
Java 关系型数据库 API
使用Spring Boot和PostgreSQL构建高级查询
使用Spring Boot和PostgreSQL构建高级查询
|
5月前
|
SQL 关系型数据库 数据库
Python查询PostgreSQL数据库
木头左教你如何用Python连接PostgreSQL数据库:安装`psycopg2`库,建立连接,执行SQL脚本如创建表、插入数据,同时掌握错误处理和事务管理。别忘了性能优化,利用索引、批量操作提升效率。下期更精彩!💡 csvfile
Python查询PostgreSQL数据库
|
6月前
|
SQL 关系型数据库 数据库
SQL 42501: Postgresql查询中的权限不足错误
SQL 42501: Postgresql查询中的权限不足错误
441 0