postgresql中关联多表递归查询,并分组计数、求和

数据表

create table greenSpace
(
    gid  serial,
    type varchar(254), -- 类型,关联类型表code字段
    area numeric -- 面积
);

类型表(父子级关系),最父级的父级编码是-1

create table greenType
(
    code               varchar(10) not null -- 类型编码
        constraint greenType
            primary key,
    name               varchar(20), -- 类型名称
    parentcode         varchar(10) -- 父级编码
);

 递归查询语法结构:

with recursive 名字 as (
    A.初始条件语句(非递归部分)
    
    union [all] 
    
    B.递归部分语句
) [SELECT | INSERT | UPDATE | DELETE]

说明: 前半部分A为初始条件语句,后半部分B为要进行的递归语句


先执行A语句,然后将A语句的结果作为B语句的条件,如果需要对查询结果去重则使用union进行连接,否则使用union all进行连接

需求一:把数据表中数据按type分类,并归类到顶级的父类,统计每个大类的个数

WITH RECURSIVE r AS (
    SELECT d.*, ld.gid
    FROM greenType d
             left join greenSpace ld
                        on d.code = ld.type
    union ALL
    SELECT d.*, r.gid
    FROM greenType d,
         r
    WHERE d.code = r.parentcode
)
SELECT r.name, count(r.gid)
FROM r
where parentcode = '-1'
group by r.name

需求二:把数据表中数据按type分类,并归类到顶级的父类,统计每个大类中所有面积字段和

WITH RECURSIVE r AS (
    SELECT d.*, ld.area
    FROM greenType d
             left join greenSpace ld
                        on d.code = ld.type
    union ALL
    SELECT d.*, r.area
    FROM greenType d,
         r
    WHERE d.code = r.parentcode
)
SELECT r.name, coalesce(sum(r.area),0)
FROM r
where parentcode = '-1'
group by r.name

更多用法待研究……

如有问题,欢迎指出讨论

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿演

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值