【问题标题】:Meaning of (+) in SQL queriesSQL 查询中 (+) 的含义
【发布时间】:2010-10-05 18:39:09
【问题描述】:

我在 Oracle 中遇到了一些包含“(+)”的 SQL 查询,但我不知道这意味着什么。有人可以解释其用途或提供一些使用示例吗? 谢谢

【问题讨论】:

  • 这是this post 的副本。您可以在那里找到更多信息。
  • 我实际上尝试在发布问题之前搜索答案,但在搜索“+”或“(+)”时没有得到任何结果。奇怪的是,URL 中的问题标题似乎也跳过了 (+) 部分。

标签: sql oracle


【解决方案1】:

它是 Oracle 的 OUTER JOIN 的同义词。

SELECT *
FROM a, b
WHERE b.id(+) = a.id

给出与

相同的结果
SELECT *
FROM a
     LEFT OUTER JOIN b
     ON b.id = a.id

【讨论】:

  • 我会注意下一个人,注意这里的ab发生了什么。在示例中,from 子句是 [a, b],但等效性检查是 [b.id = a.id]。我的习惯是保持等价[a.id = b.id];所以我误读了这个例子。我生命中的一个小时我不会回来;^)
  • 对此,我将(+) 解释为oracle 的说法“当找不到匹配项时,此方为空”。使用我的规范等同于[a.id = b.id];然后发生了一面镜子。如果我按照现代标准重写查询,[a.id = b.id(+)] 将变为 LEFT OUTER,[a.id(+) = b.id] 将变为 RIGHT OUTER。
  • 问题是 (+) 运算符直接放在条件语句中和可选表的一侧(允许在条件中包含空值或空值的表)。跨度>
【解决方案2】:

+ 是 OUTER JOIN 的捷径,根据你放在哪一边,它表示 LEFT 或 RIGHT OUTER JOIN

查看this forum post 中的第二个条目以获取一些示例

【讨论】:

    【解决方案3】:

    您使用它来确保您要加入的表不会减少返回的记录数量。因此,当您加入的表可能没有您加入的每个键的记录时,它会很方便。

    例如,如果您要加入 Customer 和 Purchase 表:

    要列出所有个客户及其所有购买,请在“购买”表上执行外部联接 (+),这样尚未购买任何东西的客户仍会显示在您的报告中。

    【讨论】:

      【解决方案4】:

      IIRC,在旧版本的 Oracle 中使用 + 来表示 pre-ANSI SQL 连接语法中的外连接。换句话说:

      select foo,bar
      from a, b
      where a.id = b.id+
      

      相当于

      select foo,bar
      from a left outer join b
      on a.id = b.id
      

      注意:这可能是向后的/稍微不正确,因为我从未使用过 pre-ANSI SQL 语法。

      【讨论】:

      • 它用于我们这些讨厌 ANSI sql 的新版本的 Oracle。
      • @Mark Brady 完全正确。我觉得它使查询的意图更加清晰。而且我也讨厌 ANSI SQL。
      猜你喜欢
      • 2018-03-06
      • 1970-01-01
      • 2018-12-09
      • 2018-04-18
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      相关资源
      最近更新 更多