PostgreSQL key words of LATERAL

PostgreSQL key words of LATERAL,第1张

概述文档解释: FROM子句中出现的子查询可以放在关键字LATERAL之前,这样就允许它们引用通过前置FROM条目提供的字段。(如果没有LATERAL,那么每个子查询都被认为是独立的并且不能交叉引用任何其他的FROM条目。) 这是PostgreSQL9.3的新增特性,第一次看到这解释,估计看不懂,看下面解释。 1. 准备好的数据。 postgres=# select * from tb10; id

文档解释:

FROM子句中出现的子查询可以放在关键字LAteraL之前,这样就允许它们引用通过前置FROM条目提供的字段。(如果没有LAteraL,那么每个子查询都被认为是独立的并且不能交叉引用任何其他的FROM条目。)

这是Postgresql9.3的新增特性,第一次看到这解释,估计看不懂,看下面解释。


1. 准备好的数据。

postgres=# select * from tb10; ID | name1 ----+-------  1 | aa  2 | bb  3 | cc(3 rows)postgres=# select * from tb11; ID | name2 ----+-------  1 | dd  3 | ee  5 | ff(3 rows)
2.如果没有LAteraL,那么每个子查询都被认为是独立的并且不能交叉引用任何其他的FROM条目。这句话的解释:

postgres=# select * from tb10 a inner join(select ID,name2 from tb11)b on a.ID=b.ID; ID | name1 | ID | name2 ----+-------+----+-------  1 | aa    |  1 | dd  3 | cc    |  3 | ee(2 rows)
这个是正常情况,这里有两个独立的from子查询,如果想在第二个子查询里面引用第一个子查询的数据,like the following:
postgres=# select * from tb10 a inner join(select ID,name2,a.name1 from tb11)b on a.ID=b.ID;ERROR:  invalID reference to FROM-clause entry for table "a"liNE 1: select * from tb10 a inner join(select ID,a.name1 from...                                                        ^HINT:  There is an entry for table "a",but it cannot be referenced from this part of the query.
第二个子查询想引用第一个子查询的name1字段,提示错误,非法访问表a的from查询。

3. 使用LAteraL关键字:

postgres=# select * from tb10 a inner join lateral(select ID,a.name1 from tb11)b on a.ID=b.ID; ID | name1 | ID | name2 | name1 ----+-------+----+-------+-------  1 | aa    |  1 | dd    | aa  3 | cc    |  3 | ee    | cc(2 rows)
可以看到,使用了LAteraL关键字之后,一个子查询可以访问与它并列的子查询的值。

现在来看文档的解释,”FROM子句中出现的子查询可以放在关键字LAteraL之前,这样就允许它们引用通过前置FROM条目提供的字段“,应该好理解一些。

总结

以上是内存溢出为你收集整理的PostgreSQL key words of LATERAL全部内容,希望文章能够帮你解决PostgreSQL key words of LATERAL所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1176039.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存