开发者社区> ChengWen> 正文

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

简介: 随着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 [ * ]

当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;

参考资料

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ECS支持跨地域跨资源类型的标签(TAG)操作
ECS资源可以使用标签进行分组管理,如何快速将自己多地域/多种类型的资源都打上标签(TAG)呢?
733 0
PostgreSQL 11 新特性解读:分区表支持创建主键、外键、索引
PostgreSQL 10 版本虽然支持创建范围分区表和列表分区表,但创建过程依然比较繁琐,需要手工定义子表索引、主键,详见 PostgreSQL10:重量级新特性-支持分区表,PostgreSQL 11 版本得到增强,在父表上创建索引、主键、外键后,子表上将自动创建,本文演示这三种场景。
4996 0
自己留存:mysql full text 支持中文的一个设定
innodb_ft_min_token_size=1 ft_min_word_len=1
534 0
C# 让RichTextBox支持GIF
我只是做了一些简单的测试...有疑问给我发消息把. 使用方法 //获取选择的图形 并且保存出来 private void button2_Click(object sender, EventArgs e)    ...
887 0
第八章 让Bootstrap轮播插件carousel支持左右滑动手势的三种方法
因为最近开发的项目涉及到移动设备上的 HTML5 开发,其中需要实现轮播效果。然后最快捷的方式,你知道的(Bootstrap),然后原生的 Bootstrap 的 carousel.js 插件并没有支持手势。
1125 0
+关注
4
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载