postgresql递归查询使用CTE

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

实现效果
效果图

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hello Bug

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

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

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

打赏作者

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

抵扣说明:

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

余额充值