加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL key words of LATERAL

发布时间:2020-12-13 17:20:25 所属栏目:百科 来源:网络整理
导读:文档解释: FROM 子句中出现的子查询可以放在关键字 LATERAL 之前,这样就允许它们引用通过前置 FROM 条目提供的字段。(如果没有 LATERAL ,那么每个子查询都被认为是独立的并且不能交叉引用任何其他的 FROM 条目。) 这是PostgreSQL9.3的新增特性,第一次

文档解释:

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条目提供的字段“,应该好理解一些。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读