postgreSQL 使用With字句的例子

PostgreSQL中WITH查询公用表表达式 PostgreSQL中WITH查询(也称为公用表表达式,Common Table Expressions,简称CTE)是一种用于定义临时结果集的语句,这个结果集可以在后续的查询中被引用 阅读详情
经常在SQL中会遇到比较复杂的SQL,很多老手也不知道怎么入手。在Postgres数据库中有一种强大的with用法,可以分拆复杂的SQL并重新组装,也可以当做临时表来使用,之前也曾用with语法来实现SQL层面的递归。以下介绍开发中遇到的另一个例子。 

环境: Postgres 9.1.2 
评论表T1(user_id reference T2(user_id)) 
用户表T2(user_id) 

场景:  
需要对T1表中数据按评论数分组排序,选择前5条记录与表T2进行关联,返回满足条件的T2用户数据,但要根据T1的排序结果来展示,也就是要显示评论最多的5个用户的详细信息,并按评论数把用户从高到低排列。 

开发的SQL: 
1.查看表T1,并排序
select user_id,count(1) from t1 group by user_id order by  count(1) desc limit 5;
    

2.与表T2关联
select * from t2 where user_id in(
select user_id from t1 group by user_id order by  count(1) desc limit 5);
但是展示的T2结果虽然取出来了,但并没有排序,没有达到效果 
 

解决办法:  
1.使用两个表的join来实现
select t2.user_id,t2.user_name,count(1) as num from t1,t2 
where t1.user_id = t2.user_id 
group by t2.user_id,t2.user_name
order by num desc limit 5; 
2.用with来构造:
with tmp as(
select user_id,count(1) as num from t1 group by user_id order by  num desc limit 5
)
select t2.*,tmp.num from t2 inner join tmp
on t2.user_id = tmp.user_id order by tmp.num desc 

分析: 
第一种办法需要两张表关联再分组取前5条,执行计划如下:


如果数据量比较大,尤其是T2表很大的时候,会消耗比较多的资源,另外如果想取用户表里有其他的字段,也需要进行分组
第二种办法是采用with来构造临时表,然后再去与T2表关联取数,执行计划如下: 


可以看到消耗的资源相对少一点,测试中发现T2、T1表很大的时候,这种差距尤其明显。

【PostgreSQL教程】PostgreSQL WITH 子句 在 PostgreSQL 中,WITH 子句提供了一种编写辅助语句的方法,以便在更大的查询中使用。 WITH 子句有助于将复杂的大型查询分解为更简单的表单,便于阅读。这些语句通常称为通用表表达式(Common Table Express, CTE),也可以当做一个为查询而存在的临时表。 WITH 子句在多次执行子查询时特别有用,它允许我们在查询中通过它的名称(可能是多次)引用它。 WITH 子句必须先定义再使用。 阅读详情

相关推荐

手把手教你用LDR9201芯片DIY高性能Type-C耳机转接头(附电路图)

本文详细介绍了基于LDR9201芯片DIY高性能Type-C耳机转接头的完整实战教程。从芯片选型、电路设计、元器件采购到焊接调试,手把手指导如何打造一个免驱兼容、支持高解析度音频且可通过EEPROM深度定制功能的专属转接头。重点解析了LDR9201作为高度集成的USB音频控制器SoC的优势,并提供了核心电路图与配置指南,适合电子爱好者和硬件开发者实践。

jump7的博客 359

PostgreSQL-WITH AS使用

with as 语法:WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会 被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数 据的部分。 特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话...

sunkwa的博客 2万+

单相变换器的二次纹波分析

1. 单相PWM整流器的二次纹波产生原因   单相变换器的二次纹波产生的原因是功率含有二次脉动分量。设电网电压 us=Vmsin(wt),电网电流IL=Imsin(wt−θ)I_L=I_msin(wt-\theta)IL​=Im​sin(wt−θ)。其中w是电网电压披绿,θ\thetaθ是电流之后电压相位。保证输入功率和输出功率相等,就要保证两者的直流量和交流量对应相等。   uDu_DuD​为 PWM 整流器直流电容电压平均值,IoI_oIo​ 为负载电流平均值 ,uDC^\widehat {u_{DC}

qq_38847810的博客 4975

PostgreSQL 10.1 手册_部分 II. SQL 语言_第 7 章 查询_7.8. WITH查询(公共表表达式)...

7.8.WITH查询(公共表表达式) 7.8.1.WITH中的SELECT 7.8.2.WITH中的数据修改语句 WITH提供了一种方式来书写在一个大型查询中使用的辅助语句。这些语句通常被称为公共表表达式或CTE,它们可以被看成是定义只在一个查询中存在的临时表。在WITH子句中的每一个辅助语句可以是一个SELECT、INSERT、UPDA...

weixin_34029949的博客 365

软件工程案例教程·韩万江【课后习题】

!!!!

weixin_57858263的博客 6421

保姆级教程:用BIGEMAP和Global Mapper搞定5米精度DEM高程数据下载与处理

本文提供了一份详细的5米精度DEM高程数据处理教程,涵盖从BIGEMAP下载到Global Mapper处理的完整流程。通过实战案例和避坑指南,帮助用户掌握高效下载DEM数据、优化等高线生成及坐标系转换的关键技巧,适用于GIS新手和专业人士。

weixin_34169322的博客 392

PgSQL的with as语法

然后select一下remove_alarms 出来的数据然后保存到tb_alarm_his 里面。returning 返回的这一些字段,然后进行汇总为remove_alarms。

思维小刀 1358

告别降级CUDA!手把手教你为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly + vLLM推理环境

本文详细指导如何为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly和vLLM推理环境,特别针对CUDA 12.8的适配问题提供解决方案。从硬件准备到源码编译,再到模型部署与性能调优,手把手教你构建高效AI推理系统。

weixin_33724046的博客 409

【PostgreSQL】数据查询-WITH查询(公共表表达式)

WITH提供了一种方式来书写在一个大型查询中使用的辅助语句。这些语句通常被称为公共表表达式或CTE,它们可以被看成是定义只在一个查询中存在的临时表。在WITH子句中的每一个辅助语句可以是一个SELECT、INSERT、UPDATE或DELETE,并且WITH子句本身也可以被附加到一个主语句,主语句也可以是SELECT、INSERT、UPDATE或DELETE。

圈小圈DBA的博客 3739

FPGA数字信号处理中定点数的舍入与饱和硬件实现详解

在数字信号处理(DSP)的硬件实现中,定点数运算是核心基础。由于硬件资源(如FPGA的DSP Slice)的位宽有限,连续的乘加运算会导致数据位宽膨胀,严重影响时序和资源利用率。为解决此问题,必须引入舍入(Rounding)和饱和(Saturation)机制。舍入通过对低位进行四舍五入,在可控的精度损失下缩减位宽;饱和则作为动态范围的守护者,防止数据溢出导致信号环绕失真,确保系统行为确定。这两种技术是算法在有限精度硬件上正确、高效运行的关键,广泛应用于滤波器、FFT等DSP模块以及通信、音频处理等场景。本文

weixin_30954817的博客 248

大数据与宠物:健康监测数据分析

随着全球宠物市场规模的快速增长(2023年全球宠物产业规模已达3500亿美元),宠物健康管理需求呈现指数级上升。传统宠物医疗依赖定期体检和症状观察,存在滞后性和主观性缺陷。本文聚焦如何通过物联网(IoT)设备采集宠物生理数据(体温、心率、活动量等),利用大数据分析技术构建实时健康监测系统,实现宠物健康状态的动态评估、异常预警和疾病预测。研究范围涵盖数据采集技术、数据预处理方法、机器学习模型构建及实际应用场景落地。背景介绍:明确研究目的、目标读者及核心术语核心概念与联系。

2502_91592937的博客 1068

postgresql with的简单用法

之前在做项目时,用到了with的递归查询,但是对with基本不了解。所以查了官方文档,现在官方文档关于with用法的说明复制了一份方便自己查看使用。 WITH提供了一种方式来书写在一个大型查询中使用的辅助语句。这些语句通常被称为公共表表达式或CTE,它们可以被看成是定义只在一个查询中存在的临时表。在WITH子句中的每一个辅助语句可以是一个SELECT、INSERT、UPDATE或DELETE,并且WITH子句本身也可以被附加到一个主语句,主语句也可以是SELECT、INSERT、UPDATE或DELETE。

freshman2020的博客 6385

【产品经理修炼之道】- 基金产品-“TA系统 ”

TA:Transfer Agent 缩写,通常称成“登记过户”。开放式基金登记过户(TA)系统是基金的登记过户系统。其功能涵盖了基金交易业务的各个环节,包括账户业务处理,如投资者开户、修改账户资料、挂失/解挂等;日常交易业务处理,如认购、申购(一般申购和定期定额)、赎回(一般赎回、指定赎回、预约赎回等)、转托管、基金转换等;特殊业务处理,如非交易过户、账户冻结/解冻等;分红业务处理,如现金分红和红利再投资。

xiaoli8748的专栏 1679

PostgreSQL WITH 子句(CTE)详解

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

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

PostgreSql中WITH语句的使用

PostgreSql中WITH语句的使用 With语句是为庞大的查询语句提供了辅助的功能。这些语句通常是引用了表表达式或者CTEs(一种临时数据的存储方式),可以看做是一个查询语句的临时表。在With语句中可以使用select,insert,update,delete语句。当然with也可以看成是一个单独的语句。 1. With语句中使用select WITH regiona

chuan_day的专栏 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

postgresql——WITH RECURSIVE

文章目录前言准备工作实验WITH RECURSIVE 使用限制总结 前言 RECURSIVE,递归查询。他将WITH从单纯的句法便利变成了一种在标准SQL中不能完成的特性。通过使用RECURSIVE,一个WITH查询可以引用它自己的输出。 准备工作 CREATE TABLE "resource" ( "id" int4 NOT NULL constraint resource_pk primary key, "name" text, "parent_id" int4 ); INSERT INT

weixin_43993065的博客 5041

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

PostgreSQL WITH 子句

PostgreSQL的WITH子句(通用表表达式CTE)可以将复杂查询分解为更简单的部分,提高可读性。CTE支持递归查询,能引用自身输出数据。示例演示了基本CTE查询、递归CTE计算工资总和,以及通过WITH子句实现数据删除和转移。WITH子句还能与INSERT、UPDATE、DELETE语句结合使用,在单个查询中完成多个操作。

nmxiaocui的博客 1039

PostgreSQL WITH(WITH RECURSIVE) 查询表达式

PostgreSQL9.6中对WITH查询有如下描述 WITH提供了一种方式来书写在一个大型查询中使用的辅助语句。这些语句通常被称为公共表 表达式或CTE,它们可以被看成是定义只在一个查询中存在的临时表。在WITH子句中的每仏个辅助语句可以是一个SELECT、INSERT、UPDATE或DELETE,并且WITH子句本身也可以被附加到一个主语句,主语句也可以是SELECT、INSERT、UPDA...

林胖的专栏 2808

postgresql with的使用

在PostgreSQL里,提供了一种方法写一个大的查询中使用的辅助报表与查询。它有助于打破复杂和大型查询简单易读的形式。这些声明,这是通常被称为通用表表达式或CTE值,可以被看作是定义临时表的存在只是一个查询。 WITH查询由CTE查询时特别有用的子查询执行多次。它是代替临时表中同样有帮助。它计算聚合一次,让我们来引用它由它的名字(可能是多次)查询。 WITH子句必须定义,在能在查询中

冰雪中的昙花 1074

postgresql with 递归查询

postgresql with RECURSIVE 递归查询

朝着梦想 渐行前进 8553

PostgreSQL with子句使用

单个with子句及多个with子句结合使用方法

lining0420的博客 5077

PostgreSQL with(with recursive )查询

一个递归WITH查询的通常形式总是一个非递归项,然后是UNION(或者UNIONALL),再然后是一个递归项,其中只有递归项能够包含对于查询自身输出的引用。把所有剩余的行包括在递归查询的结果中,并且也把它们放在一个临时的工作表中。将剩下的所有行包括在递归查询的结果中,并且也把它们放在一个临时的中间表中。withas这种查询中建立的表为临时表查询的时候存在不查询的时候就取消。WITH中SELECT的基本价值是将复杂的查询分解称为简单的部分。|7|All>药品>中药>中成药|......

qq_41810415的博客 3690

Postgresql兼容Oracle改造系列——START WITH/CONNECT BY

Oracle分层查询 Oracle中START / WITH / CONNECT BY提供分层查询的能力,从START WITH开始遍历记录,递归查询结果集直到拿到所有满足条件的结果。 例如下面测试数据: drop table sr_menu; create table sr_menu( id number(10) not null, parent number(10), title varchar2(50) ); insert into sr_menu values (1, null,

InternalsOf 1万+

MySQL与PostgreSQL兼容性对比:with_advisory_lock使用注意事项

with_advisory_lock是一个为ActiveRecord提供数据库 advisory lock(咨询锁)支持的Ruby库,能够帮助开发者在分布式系统中实现资源互斥访问。本文将深入对比MySQL与PostgreSQL在使用with_advisory_lock时的兼容性差异及关键注意事项,助你避开数据库锁机制的"陷阱"。 ## 📌 核心功能与兼容性概览 advisory lock是一

gitblog_00485的博客 1111

postgresql——WITH语句

文章目录前言WITH查询WITH修改WITH注意事项 前言 WITH提供了一种方式来书写在一个大型查询中使用的辅助语句,可以把他看做成一张临时表。 WITH语句作为一个辅助语句依附于主语句,也叫CTE。WITH语句和主语句都可以是SELECT,INSERT,UPDATE,DELETE中的任何一种语句。 WITH查询 用户、公司、关联表3表连查 WITH eResult AS ( SELECT e.id empid,e.name empname FROM emp e ), ecResult AS ( SE

weixin_43993065的博客 1998
上一篇: eclipse打开当前文件所在文件夹的两种方法
下一篇: update语句的语法与原理
zljjava
博客等级 码龄15年 155粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值