【问题标题】:Do you use the OUTER keyword when writing left/right JOINs in SQL?在 SQL 中编写左/右 JOIN 时是否使用 OUTER 关键字?
【发布时间】:2009-11-16 11:28:59
【问题描述】:

我经常看到这样写SQL的人:

SELECT * from TableA LEFT OUTER JOIN TableB ON (ID1=I2)

我自己写的很简单:

SELECT * from TableA LEFT JOIN TableB ON (ID1=I2)

对我来说,“OUTER”关键字就像线路噪音——它没有添加额外的信息,只是让 SQL 变得混乱。在我知道的大多数 RDBMS 中,它甚至是可选的。那么......为什么人们仍然写它?这是一种习惯吗?可移植性? (无论如何,您的 SQL 真的是可移植的吗?)还有什么我不知道的?

【问题讨论】:

  • 我完全同意。 OUTER 关键字只是噪音。少即是多。
  • 当我们不确定哪个表实际有数据时,我们可以使用它吗?我们需要任何一个表的数据?
  • 听起来你需要FULL [OUTER] JOIN,尽管从你的描述中不太清楚。也许您需要UNION。写一个新问题并详细描述你的数据和结构。到时候你会很快得到答案的。

标签: sql syntax rdbms-agnostic


【解决方案1】:

OUTER 真的是多余的,正如您所写,因为所有 OUTER 连接都是 LEFTRIGHT,并且反过来所有 LEFTRIGHT 连接都是 OUTER。因此,正如您所说,从句法上讲,它主要是噪音。即使在 ISO SQL 中也是可选的。至于人们为什么使用它,我想有些人觉得有必要坚持加入 OUTER,即使 left-or-right 关键字已经这么说了。就此而言,INNER 也是多余的!

【讨论】:

  • 我问了一些使用 INNER/OUTER 选择器的同事,对他们来说这更像是一个图像参考;当他们放 OUTER 时,他们想象维恩图的外部。对我来说,这总是一种噪音。
【解决方案2】:

是的

在我看来,它只是让事情变得更清晰——你表达你的意图越清晰、越明显越好(尤其是对于以后试图阅读和理解你的代码的其他人来说)。

但这只是我的意见——技术上不需要,所以你可以使用它——或者离开它。

【讨论】:

  • +1 表示“特别是对于其他试图稍后阅读和理解您的代码的人”
【解决方案3】:

没有。我用

  • 加入
  • 左连接
  • 右连接
  • 完全外连接
  • 交叉连接

对我来说没有歧义。

【讨论】:

  • 那为什么不用full join 而不是full outer join呢?
  • 出于某种原因,我最终只使用 OUTER 这个词来表示 FULL OUTER 联接。我无法解释,听起来更好。我猜是我个人的喜好。
【解决方案4】:

使用 Stackoverflow 的几个月向我展示的一件事是,有多少 SQL 是由以前完全没有接触过 SQL 或关系数据库的人编写和/或维护的。

因此,我认为你越明确,下一个程序员在查看你的代码时就会越好。

【讨论】:

    【解决方案5】:

    这只是一个品味问题,我猜人们使用它是因为他们发现它导致代码更具可读性。例如,我更喜欢使用同样可选的 AS 关键字,因为对我来说,SELECT ... FROM table AS t 看起来比 SELECT ... FROM table t 更具可读性。

    【讨论】:

      【解决方案6】:

      我正在使用“内连接”、“左连接”、“右连接”和“完全外连接”。没有“内部”的“加入”对我来说有点模棱两可; 'left' 和 'right' 是自我描述的,而 'full' 是一种野兽,值得特殊的语法:)

      【讨论】:

        【解决方案7】:

        我自己使用OUTER 关键字。我同意这只是一个品味问题,但省略它让我觉得有点草率,但省略 INNER 关键字(草率)或用小写写 SQL 关键字(非常草率)还不错。

        【讨论】:

          【解决方案8】:

          我认为在 2009 年无论如何都没有 可移植 SQL 这样的东西......在某些时候,您需要编写特定于 DBMS 的语句(例如检索前 N 行)。 p>

          我个人认为 JOIN 语法是多余的,而是用逗号分隔表名。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-01-07
            • 2013-01-09
            • 2019-08-01
            • 2014-08-10
            • 1970-01-01
            • 1970-01-01
            • 2010-09-12
            • 2014-07-05
            相关资源
            最近更新 更多