postgresql递归查询使用CTE

PostgreSQL与DuckDB递归CTE查询性能对比与优化 递归CTE(Common Table Expression)是SQL中处理层次化数据的核心语法,通过WITH RECURSIVE实现树形结构遍历和图数据分析。其执行原理本质是迭代计算:先处理基础查询(anchor member),再循环处理递归部分直到满足终止条件。在OLTP场景中,成熟的查询优化器能动态调整JOIN策略和内存分配,而OLAP引擎则更依赖列式存储和并行计算优势。当处理深度递归查询时,不同数据库的实现差异会导致显著性能差距,例如PostgreSQL的智能Hash Join优化对比DuckDB的 阅读详情

with查询是PostgreSQL支持的高级SQL特性之一,这一特性常称为CTE(Common Table Expressions),with查询就相当于在查询中定义的临时表,应用场景层次结构或树状结构
但是递归查询有一个重要属性,RECURSIVE,使用RECURSIVE属性可以引用自己的输出,从而实现递归。

至于怎么用接下来看我的案例吧!

存在一张包含以下数据的表
表数据列表

当给定一个id时能得到它完整的地名,id=7时,地名是:中国辽宁沈阳和平区,当id=5时,地名是:中国辽宁大连

思路步骤
1.使用PostgreSQL的WITH查询ID为7以及以上的所有父节点和名字
2.将输出的记过的name字段合并一个,通过string_agg函数实现(函数传送门)

具体代码如下

with recursive t as(
	select * from test_area where id = 7
	union all
	select test_area.* from test_area,t where test_area.id=t.fatherid
) 
select string_agg(n.name,'') from (select name,id from t  order by id) n

总结CTE的好处
1.CTE可以简化SQL代码,减少SQL嵌套层数,提高SQL代码的可读性。
2.CTE的辅助语句只需要计算一次,在主查询中可以多次使用。
3.当不需要共享查询结果时,相比视图更轻量。

=2021.08.10分割线===========
其中,我想要一个sql我想要一个SQL查询将第二行数据显示为第一行,将第三行数据显示为第二行,依此类推
举个例子,我想要年龄为这样

年龄(岁)下一个年龄(岁)
1岁2岁
2岁3岁
3岁4岁

实现的sql语句用递归查询

WITH CTE AS
(
	
	select 

	toUInt64OrZero(age) as age
	from resident_long rl
	group by age
	order by age
)
SELECT base.age `年龄(岁)`, nxt.age `下一个年龄(岁)`
from CTE base
LEFT OUTER JOIN CTE nxt on nxt.age = base.age + 1

实现效果
效果图

PostgreSQL里的子查询和CTE居然在性能上“掐架”?到底该站哪边? 子查询是嵌套在其他查询中的查询语句,本质是“用一个查询的结果作为另一个查询的输入”。非相关子查询:可独立执行,不依赖外部查询的任何值(比如“先统计各地区销售额,再过滤超过100万的地区”);相关子查询:依赖外部查询的字段值(比如“计算每个订单对应的客户平均订单金额”)。示例:非相关子查询-- 统计销售额超100万的地区(非相关子查询)FROM (SELECT region, SUM(amount) AS total_sales -- 子查询:统计各地区销售额示例:相关子查询。 阅读详情

相关推荐

PostgreSQL之SQL高级特性

1.with 查询 2.批量插入 3.returning 返回修改数据 4.upsert 5.数据抽样 6.聚合函数 7.窗口函数

奋斗的阿杰的博客 862

PostgreSQL中的CTE(公共表表达式)知多少? - (中级)

PostgreSQL中的CTE:公共表表达式是一种更好的临时表. 用于较大查询的辅助语句.用于只在一个查询中存在的临时表。在WITH子句中的每一个辅助语句可以是一个SELECTINSERTUPDATE或DELETE,并且WITH子句本身也可以被附加到一个主语句,主语句也可以是SELECTINSERTUPDATE或DELETE。这也是PostgreSQL的一个非常重要的功能。有很多商用关系数据库甚至还没有这个特色功能。仔细再读了下这篇文档,感觉组织的不是很理想。试图重新组织一下,便于理解其中的使用方法。

iihero@优快云 2667

《PostgreSQL开发指南》第20篇 通用表表达式

通用表表达式(Common Table Expression)是一个临时的查询结果或者临时表,可以在其他SELECT、INSERT、UPDATE以及DELETE语句中使用。 使用 CTE 可以提高复杂查询的可读性,递归 CTE 可以遍历各种层次数据。CTE 和 DML 语句一起使用可以在一个语句中执行多个表的操作。

Tony.Dong的专栏 2733

【PostgreSQL】提高篇——公用表表达式(CTE)和窗口函数

公用表表达式(Common Table Expression,CTE)是一种在 SQL 查询中定义临时结果集的方式,可以在主查询中多次引用。CTE 可以提高查询的可读性和结构性,尤其是在处理复杂的查询时。使用 CTE,可以避免使用嵌套查询,从而使 SQL 代码更清晰。窗口函数是一种在结果集的每一行上执行计算的函数,它允许我们在不分组的情况下进行聚合计算。窗口函数通常用于计算排名、移动平均、累计和等。与普通的聚合函数不同,窗口函数不会减少结果集的行数。

thinking_chou的专栏 1907

【postgresql 基础入门】CTE(common table expression)让你轻松写出复杂多变的嵌套SQL,同时SQL也可以递归树的遍历查询

在一些分析型业务中,通常会遇到一些非常复杂的SQL语句,多个子查询的联合,此时可以使用 common table expression (CTE) 方式的SQL写法,来让SQL更加简化和易于理解,本文就来分享一下postgresql中的CTE语言的写法,以及使用案例。

一个追逐梦想的码农 3502

1173:阶乘和

1173:阶乘和 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6010 通过数: 3049 【题目描述】 用高精度计算出S=1!+2!+3!+…+n!(n≤50),其中“!”表示阶乘,例如:5!=5×4×3×2×1。 输入正整数n,输出计算结果S。 【输入】 一个正整数n。 【输出】 计算结果S。 【输入样例】 5 【输出样例】 153 思路: ...

zqhf123的博客 1260

在 MySQL 中使用 CTE

CTE 是在 SQL 查询中定义的一个临时结果集,其作用范围仅限于定义它的查询。CTE 通常用于简化复杂查询,并可以用于递归查询。CTE 的定义部分类似于创建一个临时视图,但其生命周期仅限于当前查询。CTE 是 MySQL 中一个强大的查询工具,可以帮助用户简化复杂查询、提高代码的可读性和维护性。通过 CTE,用户可以轻松地定义和使用临时结果集,支持递归查询和数据清理。掌握 CTE 的使用方法和最佳实践,对于提高 SQL 查询的效率和组织性至关重要。

网络技术联盟站 2517

杰理的蓝牙芯片的key是什么?以及该如何添加key?杰理key文件原理

很多的工程师,在开发杰理蓝牙芯片的第一步就会有一个很深的疑惑,关于key的 1、什么是key文件? 2、Key文件是如何产生的? 3、为什么需要他key文件? 4、如何添加key文件? 5、以及实际开发中的一些报错该如何处理?

qyvhome的博客 4095

PostgreSQL CTE技术详解:从基础到递归查询实战

公用表表达式(CTE)是SQL中处理复杂查询的利器,它通过WITH子句创建临时命名结果集,显著提升代码可读性和维护性。CTE的工作原理是将查询逻辑模块化,支持链式定义和递归调用,特别适合处理层次结构数据和分阶段分析场景。在PostgreSQL中,CTE默认采用物化执行策略,能有效优化多次引用的中间结果计算。实际工程中,CTE广泛应用于电商用户行为分析、商品推荐系统、组织结构遍历等场景,与窗口函数、JSON处理等高级特性结合能发挥更大价值。通过合理使用MATERIALIZED/NOT MATERIALIZED

weixin_33462167的博客 139

避坑指南:Vue2中使用TinyMCE5常见问题解决方案(含PowerPaste插件异常处理)

本文针对Vue2项目中集成TinyMCE 5富文本编辑器时遇到的高频疑难问题,提供了一套深度实战解决方案。内容涵盖环境搭建、资源路径配置、图片与视频上传处理、以及替代PowerPaste插件的自定义粘贴清理方案,旨在帮助开发者有效规避常见陷阱,构建稳定可靠的内容编辑功能。

weixin_29012677的博客 154

从零开始:手把手教你检查并更新英伟达GPU驱动和CUDA版本(Windows/Linux双平台)

本文详细指导如何在Windows和Linux系统上检查并更新英伟达GPU驱动和CUDA版本,解决版本不匹配导致的常见问题。涵盖驱动更新、CUDA Toolkit安装、版本冲突排解及性能优化技巧,帮助开发者高效管理GPU计算环境。

weixin_29237635的博客 701

PostgreSQL递归CTE实现层级数据查询优化

递归查询是处理树形结构数据的核心技术,通过自引用实现多级数据遍历。PostgreSQL的递归CTE特性将递归逻辑封装在SQL语句中,避免了应用程序多次查询的开销。其工作原理基于基础查询和递归部分的组合,特别适合文件系统、组织架构等层级数据场景。通过添加深度信息、路径追踪和循环检测等扩展功能,可以构建更健壮的查询方案。相比多次查询或嵌套集模型,递归CTE在查询效率与维护成本间取得平衡,是数据库工程中处理层级关系的优选方案。

weixin_32576389的博客 8

ComfyUI新手必看:JoyCaption 2插件安装全流程(附百度网盘资源)

本文为ComfyUI新手提供了JoyCaption 2插件的完整安装与部署指南。详细介绍了从环境准备、插件获取、模型文件配置到核心节点使用的全流程,并重点解析了其集成的LLM反推模式,帮助用户高效实现从图片到精准提示词的转换。

mango的博客 303

PostgreSQL CTE实战:从复杂SQL重构到递归查询与性能优化

SQL查询复杂度上升后,嵌套子查询的可读性与维护性成为开发者面临的核心挑战。公用表表达式(CTE)通过WITH子句将查询拆解为多个逻辑步骤,让复杂逻辑像代码一样分步构建与验证,其核心价值在于支持中间结果复用、递归展开以及多阶段聚合的清晰表达。在PostgreSQL中,CTE的执行策略包含物化与内联两种方式,优化器会依据使用场景自动选择,而开发者可通过EXPLAIN ANALYZE精准定位性能瓶颈,并结合NOT MATERIALIZED等关键字手动调优。实际工程中,无论是重构多层级报表、处理组织架构树,还是实

weixin_31714129的博客 242

华为OD机试 - 计算数列位置N的值 - 模拟法(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。输入 M,N 两个数,则按照以下规则形成一个数列。数列的前 M 个元素的值为 1 到 M从 M+1 个元素开始,计算逻辑为如果其前 M 个元素中,存在值相同的元素,则该位置上的数值等于前 M 个数中最大数值与最小数值之和。如果其前 M 个元素中,

学Java,找哪吒 508

DeepSeek+即梦:AI视频创作从0到1全突破

本文为 DeepSeek 与即梦生成视频全攻略,从前期注册登录、熟悉工具界面及硬件网络准备入手,助读者开启 AI 视频创作。详细阐述利用 DeepSeek 构思脚本、即梦实现画面生成与静态图转动态视频的方法,包括提示词编写、参数调整等技巧。同时介绍后期合成音画、添加字幕特效及多平台适配要点,结合实战案例解析全流程。还分享进阶提示词优化、版权注意等避坑指南,为创作者提供从 0 到 1 的 AI 视频创作完整解决方案。

邓邓子的博客 8105

基于 PostgreSQL Exercises 数据集的 Peewee 查询实战:从基础 SQL 到窗口函数与递归 CTE 的完整对照指南

本文是一份以 Peewee ORM 为主体的查询实战指南,全部练习取自 PostgreSQL Exercises 网站的 club 示例数据集(members / facilities / bookings 三张表)。读者将掌握 Peewee 中 select/where 条件构造、字符串与日期过滤、JOIN 与自连接、子查询、insert/update/delete 各类 DML、GROUP B

gitblog_01052的博客 458

SE模块理解+SE-Resnet模块pytorch实现

文章目录SE模块理解SE实现注意力机制原因SE-resnet网络pytorch实现定义residual定义SE模块 SE模块理解 SENet是Squeeze-and-Excitation Networks的简称,拿到了ImageNet2017分类比赛冠军,其效果得到了认可,其提出的SE模块思想简单,易于实现,并且很容易可以加载到现有的网络模型框架中。SENet主要是学习了channel之间的相关性,筛选出了针对通道的注意力,稍微增加了一点计算量,但是效果比较好。 SE模块广泛应用于去噪,去雨方向,利用SE模

qq_42754919的博客 2万+

PostgreSQL CTE实战:用公用表表达式拆解复杂查询与递归优化

复杂SQL往往因为多层嵌套、多表关联、重复引用而难以维护。公用表表达式(CTE)作为一种具名的临时结果集,能把复杂查询拆解为清晰的步骤链,有效提升可读性与可调试性。从基础WITH语法到多步骤聚合、占比排名、数据清洗去重,再到递归CTE处理树形结构,CTE覆盖了绝大多数复杂查询场景。同时,PostgreSQL 12前后的物化与内联行为差异,也决定了CTE在性能调优中需要灵活选择策略。理解CTE的执行原理,合理使用MATERIALIZED与NOT MATERIALIZED,能在不影响逻辑表达的前提下优化查询效率

weixin_29597551的博客 271

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SQL递归查询(with cte as)--postgresql,mysql

with cte as ( select Id,Pid,DeptName,0 as lvl from Department where Id = 2 union all select d.Id,d.Pid,d.DeptName,lvl+1 from cte c inner join Department d on c.Id = d.Pid ) select ...

幸福的娃娃菜 468

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

PostgreSQL WITH 子句(CTE)详解

PostgreSQL 的WITH子句(又称公用表表达式,Common Table Expression,CTE)是编写复杂SQL查询的强大工具。它允许创建临时命名结果集,可以在主查询中多次引用,显著提高复杂查询的可读性和可维护性。WITH),提高可读性:将复杂查询分解为逻辑模块代码重用:避免重复子查询递归能力:轻松处理层级数据数据修改:在单一语句中实现复杂操作优化潜力:为查询优化器提供更多信息。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 9442

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Sql递归查询】Mysql、Oracle、SQL Server、PostgreSQL 实现递归查询的区别与案例(详解)

这种常见的递归查询方式),但可以通过使用存储过程、临时表或自连接等方式来实现递归查询的效果。通过自连接的方式模拟递归查询,适合处理简单的递归结构。假设我们有一个表示部门层级关系的表。MySQL 5.7 本身不直接支持标准 SQL 中的递归查询语法(如。子句进行递归查询,查找某个员工及其所有下属。,但递归方向是从指定员工向上查找其所有上级。语句将父部门和子部门关联起来,然后使用。假设我们有一个表示员工层级关系的表。在 MySQL 8 中,可以使用。子句来实现递归查询。

A的博客 1945

pg 递归算法_PostgreSQL递归查询示例

PostgreSQL提供了WITH语句,允许你构造用于查询的辅助语句。这些语句通常称为公共表表达式或cte。cte类似于只在查询执行期间存在的临时表。递归查询是指递归CTE的查询。递归查询在很多情况下都很有用,比如查询组织结构、物料清单等层次数据下面演示了递归CTE的语法:WITH RECURSIVE cte_name(CTE_query_definition -- non-recursive t...

weixin_39759107的博客 798

PostgreSQL15——通用表表达式(CTE)

通用表表达式(Common Table Expression、CTE)是一个临时的查询结果或者临时表,可以在其他 SELECT、INSERT、UPDATE 以及 DELETE 语句中使用。通用表表达式只在当前语句中有效,类似于子查询。

吴声子夜歌的博客 1291

PostgreSQL 中 CTE 的使用

PostgreSQL 中 CTE 的使用

lizhengyu891231的博客 2632
上一篇: Postgresql如果存在则更新,没有则添加;批量添加时有重复就忽略
下一篇: SpringBoot项目Shiro框架中session会话过期后自动跳转提示框
Hello Bug
博客等级 码龄8年 87粉丝 124原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello Bug

谢谢老板,老板大气,老板硬邦邦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值