我不经常看到在横向联接(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子句对于横向联接是否必要,因为每个依赖值集只连接到它们所依赖的行。使用相同文档中的下一个示例来说明:
例如,假设顶点(多边形)返回多边形的顶点集,我们可以识别存储在表中的多边形的紧密顶点:
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子句)?
发布于 2021-10-29 15:49:34
是的,只需去掉用逗号分隔的FROM子句中列出表的古老方式:
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之间缺少连接条件的位置。
发布于 2021-10-29 16:37:54
我不认为横向的改变在这里有什么变化。
逗号联接或交叉连接不能有ON (如果有条件,则需要将条件填充到WHERE中),而其他显式连接类型需要ON或the。(我忽视了自然的加入,这是理所当然的。)
如果希望在横向联接不返回任何行的情况下返回空扩展行,则可以使用LEFT JOIN LATERAL (...) ON TRUE。除了TRUE以外的任何条件都是不必要的,因为您本可以将其写入子查询本身(但是,如果它增加了与您还需要维护的其他查询的并行性,或者只是很好地分隔了返回的行和是否返回任何行之间的逻辑,那么在ON中添加一些内容可能会更好)。
但是没有绝对的理由使用JOIN LATERAL (...) ON TRUE,因为您只需要将它写成横向交叉连接。但同样,与另一种方式相比,它可能“看上去更好”。
https://dba.stackexchange.com/questions/301884
复制相似问题