【问题标题】:PostgreSQL Join TypesPostgreSQL 连接类型
【发布时间】:2020-11-06 17:28:52
【问题描述】:

在做一些作业时,我发现了一个问题,他们要求我列出 PostreSQL 中所有可能的连接类型。 我的答案是:

  • 内连接
  • 左外连接
  • 右外连接
  • 完全外连接
  • 交叉连接

及其所有 NATURAL 等价物(NATURAL INNER JOIN、NATURAL LEFT OUTER JOIN,...)。

但是,教授告诉我们,还有一种很难找到的 JOIN 类型。在我使用 SQL 的 2 年中,我从未见过除这些以外的任何其他 JOIN 类型。

你知道任何其他的 JOIN 类型吗?你能帮帮我吗?

非常感谢。

【问题讨论】:

  • 有些东西叫做反连接,虽然它们不是用JOIN关键字处理的。
  • UNION JOIN 在 2003 年之前一直是 SQL 标准的一部分。不过,Afaik PostgreSQL 从未实现过它。
  • LATERAL JOINs 怎么样?见7.2.1.5 Lateral Subqueries
  • 这个不清楚。--“join type”是什么意思?逗号/隐式连接是与 CROSS JOIN 不同的“类型”连接吗?没有 OUTER 不同“类型”的连接是连接吗?内部连接是否使用 ON 与使用 2 种不同的“类型”? LATERAL 是否给出不同的“类型”?将使用 LATERAL 的连接表达式解释为不同类型的连接有点过分。 LATERAL 是当某些名称出现在某些子表达式中时 DBMS 可能需要的关键字。它可以被排除在处理所有情况所需的 DBMS 的语言之外。需要 LATERAL 的情况以显而易见的方式解释名称。
  • @philipxy 嗨,菲利普,我想几乎我们所有人都很清楚。答案完美地解决了我的问题。谢谢。

标签: sql postgresql join


【解决方案1】:

您的教授可能与LATERAL JOINs 有关。这实际上是一种子查询,在FROM 子句中引入。

有多种横向连接:

  • CROSS JOIN LATERAL

  • INNER JOIN LATERAL

  • LEFT JOIN LATERAL

更多信息,您可以查看the documentation

【讨论】:

    【解决方案2】:

    横向连接不是不同的连接类型。 Bot 在 PostgreSQL 中还有另外两种连接类型:半连接和反连接。

    您无法明确指定这些连接类型,但优化器可以将INEXISTS 条件中的子查询转换为半连接,将NOT EXISTS 转换为反连接。

    您可以在EXPLAIN 输出中看到这些连接类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 2011-08-04
      相关资源
      最近更新 更多