AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 301884
Accepted
tinlyx
tinlyx
Asked: 2021-10-30 06:57:57 +0800 CST2021-10-30 06:57:57 +0800 CST 2021-10-30 06:57:57 +0800 CST

PostgreSQL LATERAL 连接是否需要或允许 ON 子句?

  • 772

我不经常看到与 LATERAL 连接(PostgreSQL 11+)一起使用的 ON 子句。比如官方文档有这个例子:

LATERAL 的一个简单例子是

SELECT * FROM foo, LATERAL (SELECT * FROM bar WHERE bar.id = foo.bar_id) ss;

这不是特别有用,因为它与更传统的结果完全相同

SELECT * FROM foo, bar WHERE bar.id = foo.bar_id;

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

我觉得这个例子并不孤单。我看到许多没有 ON 子句的横向连接用法,但没有看到太多使用 ON 子句的情况。从概念上讲,横向连接是否需要 ON 子句尚不清楚,因为每组依赖值仅连接到它们所依赖的行。使用同一文档中的下一个示例来说明:

例如,假设 vertices(polygon) 返回多边形的顶点集,我们可以识别存储在表中的多边形的靠近在一起的顶点:

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 子句,甚至是否允许 LATERAL JOIN。因此这个问题:

LATERAL JOIN 是否需要/允许连接条件(ON 子句)?

postgresql lateral-join
  • 2 2 个回答
  • 363 Views

2 个回答

  • Voted
  1. Best Answer
    a_horse_with_no_name
    2021-10-30T07:49:34+08:002021-10-30T07:49:34+08:00

    是的,只需摆脱以逗号分隔的 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 之间的连接条件的位置

    • 1
  2. jjanes
    2021-10-30T08:37:54+08:002021-10-30T08:37:54+08:00

    我不认为 LATERAL 在这里改变任何东西。

    逗号连接或 CROSS JOIN 不能有 ON(如果有的话,您需要将条件填充到 WHERE 中),而其他显式 JOIN 类型需要 ON 或 USING。(我忽略了 NATURAL JOIN,这是理所当然的。)

    如果您想在横向连接不返回任何行的情况下返回一个 NULL 扩展行,那么您可以使用LEFT JOIN LATERAL (...) ON TRUE. 除了 TRUE 之外的任何条件都不是必需的,因为您可以将其写入子查询本身(但如果它增加了与您还需要维护的其他查询的并行性,或者如果它只是很好地将要返回的行与是否返回任何行之间的逻辑分开)

    但是没有绝对的理由使用JOIN LATERAL (...) ON TRUE,因为您可以将其写为 CROSS JOIN LATERAL 代替。但同样,它可能以一种方式与另一种方式“看起来更好”。

    • 1

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve