ADB PG 6.0 新特性支持 - LATERAL语法

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
简介: 随着ADB PG 6.0对PG内核的升级,ADB PG 6.0中支持了LATERAL语法。LATERAL语法在Select语句中,LATERAL关键词可以放置在sub-select的from对象之前,这样在sub-select中,在LATERAL后的对象可以引用其之前对象的列(如果不使用LATERAL,sub-select的各个对象会被单独处理,所以就无法引用from列表中的其它对象)。

随着ADB PG 6.0对PG内核的升级,ADB PG 6.0中支持了LATERAL语法。

LATERAL语法

在Select语句中,LATERAL关键词可以放置在sub-select的from对象之前,这样在sub-select中,在LATERAL后的对象可以引用其之前对象的列(如果不使用LATERAL,sub-select的各个对象会被单独处理,所以就无法引用from列表中的其它对象)。

LATERAL也可以放置在from列表中函数对象之前,这样在函数中就可以引用在其之前任何from列表中的其它对象。另外,LATERAL对象也可以出现在最外层的from列表中。

具体语法使用如下:

[ WITH [ RECURSIVE ] with_query [, ...] ]
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
    [ * | expression [ [ AS ] output_name ] [, ...] ]
    [ FROM from_item [, ...] ]
    [ WHERE condition ]
    [ GROUP BY expression [, ...] ]
    [ HAVING condition [, ...] ]
    [ WINDOW window_name AS ( window_definition ) [, ...] ]
    [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
    [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start [ ROW | ROWS ] ]
    [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
    [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF table_name [, ...] ] [ NOWAIT ] [...] ]

where from_item can be one of:

    [ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
    [ LATERAL ]( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
    with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
    [ LATERAL ] function_name ( [ argument [, ...] ] )
                [ WITH ORDINALITY ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
    [ LATERAL ] function_name ( [ argument [, ...] ] ) [ AS ] alias ( column_definition [, ...] )
    [ LATERAL ] function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )
    [ LATERAL ] ROWS FROM( function_name ( [ argument [, ...] ] ) [ AS ( column_definition [, ...] ) ] [, ...] )
                [ WITH ORDINALITY ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
    from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]

and with_query is:

    with_query_name [ ( column_name [, ...] ) ] AS ( select | values | insert | update | delete )

TABLE [ ONLY ] table_name [ * ]
AI 代码解读

当from列表中某个LATERAL对象有对其它对象的引用时,查询处理流程如下:对于被引用对象的每一行,LATERAL对象会使用改行做查询处理,处理完得到的结果会与源对象的行做join。因此,源对象中的列必须是和LATERAL对象做INNER或者LEFT join,因为尽管X RIGHT JOIN LATERAL Y在语法层面是有效的,但是实际上Y来引用X是不行的(因为需要从源表展开)。

示例:

SELECT * FROM foo, LATERAL (SELECT * FROM bar WHERE bar.id = foo.bar_id) ss;

create table test (c1 int, c2 int, c3 int);
insert into test values (1,1,1),(1,2,3),(1,3,3),(2,2,2),(2,3,2),(2,4,2),(3,4,1),(3,4,2);

create table teest1 (c1 int, c2 int);
insert into test1 values (1,2),(2,3),(3,4);

select test1.c1 from test1 left join LATERAL (select * from test where test1.c1 = test.c1) tt on true;

with t1 as (select c1, avg(c2) as avg_c2 from test group by c1)
select tbl.c1, tbl.c2, tbl.c3, t1.avg_c2 from test tbl, t1 where tbl.c1 = t1.c1;

上面的with语句可以等价写成下面LATERAL语句

select test.*, t1.avg_c2 from test, lateral (select c1, avg(c2) as avg_c2 from test group by c1) t1 where test.c1 = t1.c1;
AI 代码解读

参考资料

https://www.postgresql.org/docs/9.4/sql-select.html

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
MPP架构数据仓库使用问题之ADB PG云原生版本的扩缩容性能怎么样
MPP架构数据仓库使用问题之ADB PG云原生版本的扩缩容性能怎么样
MPP架构数据仓库使用问题之ADB PG云原生版本的扩缩容性能怎么样
MPP架构数据仓库使用问题之ADB PG对于写入时的小文件问题该如何解决
MPP架构数据仓库使用问题之ADB PG对于写入时的小文件问题该如何解决
MPP架构数据仓库使用问题之ADB PG对于sort scan算子要如何生成并优化
MPP架构数据仓库使用问题之ADB PG对于sort scan算子要如何生成并优化
MPP架构数据仓库使用问题之ADB PG的性能优化点主要包括什么方面
MPP架构数据仓库使用问题之ADB PG的性能优化点主要包括什么方面
MPP架构数据仓库使用问题之OSS的RT相比ESSD云盘较高,ADB PG这一问题是如何解决的
MPP架构数据仓库使用问题之OSS的RT相比ESSD云盘较高,ADB PG这一问题是如何解决的
MPP架构数据仓库使用问题之ADB PG相比Greenplum的HAWQ在架构设计上有什么不同
MPP架构数据仓库使用问题之ADB PG相比Greenplum的HAWQ在架构设计上有什么不同
AnalyticDB PostgreSQL 7.0 支持存储过程(CREATE PROCEDURE)特性
AnalyticDB PostgreSQL 7.0 新增了存储过程功能的支持,让用户在使用ADB PG时能够更方便高效地开发业务,并能够更好地兼容Oracle等传统数仓的业务。
595 1
AnalyticDB PostgreSQL 7.0 支持存储过程(CREATE PROCEDURE)特性
ADB PG最佳实践之高效复制数据到RDS PG
ADB PG是一个经典MPP数据库,长项在于查询分析处理,面对客户联机分析和联机交易(HTAP)场景就显得力不从心,我们在某银行核心系统DB2 for LUW迁移到ADB PG时就遇到类似问题,因此我们提出ADB PG+RDS PG混搭技术架构,来解决客户此类HTAP需求。该混搭架构的精髓在于扬长避短,充分发挥分析型数据库和交易型数据库的长处和特性,分析型数据库专注于数据加工跑批场景,然后批量加工的结果数据卸载到RDS PG,通过RDS PG对外提供高并发对客交易服务。
356 0
ADB PG最佳实践之高效复制数据到RDS PG
云原生数仓ADB PG如何破解大规模集群的关联查询性能问题?
本文从ADB PG架构设计的角度出发,探讨Runtime Filter在ADB PG中的实现方案,并介绍了基于Bloom Filter的ADB PG Dynamic Join Filter功能技术细节。
595 0

热门文章

最新文章

相关产品

  • 云原生数据仓库 AnalyticDB PostgreSQL版