首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL横向联接要求还是允许ON子句?

问PostgreSQL横向联接要求还是允许ON子句?
EN

Database Administration用户
提问于 2021-10-29 14:57:57
回答 2查看 1.3K关注 0票数 0

我不经常看到在横向联接(PostgreSQL 11+)中使用ON子句。例如,正式的文档有以下示例:

横向的一个简单的例子是SELECT * FROM * FROM (SELECT * FROM bar WHERE bar.id = foo.bar_id) ss;这并不特别有用,因为它与传统的SELECT *FROM*FROM,bar =foo.bar_id的结果完全相同;

从示例来看,等效的常规联接有一个ON子句(使用WHERE,WHERE bar.id = foo.bar_id编写),但是对于横向连接,连接条件似乎是“内化”的。

我觉得这个例子并不是唯一的。我看到了很多没有ON子句的横向连接用法,但是没有看到ON子句有多大用处。从概念上讲,尚不清楚on子句对于横向联接是否必要,因为每个依赖值集只连接到它们所依赖的行。使用相同文档中的下一个示例来说明:

例如,假设顶点(多边形)返回多边形的顶点集,我们可以识别存储在表中的多边形的紧密顶点:

代码语言:javascript
复制
SELECT p1.id, p2.id, v1, v2
FROM polygons p1, polygons p2,
     LATERAL vertices(p1.poly) v1,
     LATERAL vertices(p2.poly) v2
WHERE (v1 <-> v2) < 10 AND p1.id != p2.id;

在这里,为每个多边形p1.poly生成的顶点集仅与该多边形相关联,而不是任何其他多边形。似乎不需要使用ON子句指定计算结果与原始多边形之间的关联。“连接条件”似乎隐含在横向连接中列的依赖关系中。

我无法从链接文档中找到一个ON-子句是必要的,甚至是允许横向连接的。因此,这个问题:

横向联接是否需要/允许一个联接条件( ON子句)?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2021-10-29 15:49:34

是的,只需去掉用逗号分隔的FROM子句中列出表的古老方式:

代码语言:javascript
复制
SELECT p1.id, p2.id, v1, v2
FROM polygons p1
  JOIN polygons p2 ON p1.id != p2.id;
  JOIN LATERAL vertices(p1.poly) v1 ON true ???? 
  JOIN LATERAL vertices(p2.poly) v2 ON (v1 <-> v2) < 10 

那个?标记原始查询在v1和p1或p2之间缺少连接条件的位置。

票数 1
EN

Database Administration用户

发布于 2021-10-29 16:37:54

我不认为横向的改变在这里有什么变化。

逗号联接或交叉连接不能有ON (如果有条件,则需要将条件填充到WHERE中),而其他显式连接类型需要ON或the。(我忽视了自然的加入,这是理所当然的。)

如果希望在横向联接不返回任何行的情况下返回空扩展行,则可以使用LEFT JOIN LATERAL (...) ON TRUE。除了TRUE以外的任何条件都是不必要的,因为您本可以将其写入子查询本身(但是,如果它增加了与您还需要维护的其他查询的并行性,或者只是很好地分隔了返回的行和是否返回任何行之间的逻辑,那么在ON中添加一些内容可能会更好)。

但是没有绝对的理由使用JOIN LATERAL (...) ON TRUE,因为您只需要将它写成横向交叉连接。但同样,与另一种方式相比,它可能“看上去更好”。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/301884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档