【问题标题】:Real time usage and difference between left outer join and right outer join [duplicate]左外连接和右外连接的实时用法和区别[重复]
【发布时间】:2013-07-07 12:31:09
【问题描述】:

如果使用左外连接(选择表A左外连接表B),当数据与左表(表A)不匹配时,我可以在右表(表B)中有空值。如果我更改选择查询顺序(选择表 B 左外连接表 A),现在我可以在表 A 中有空数据。因此,使用左外连接可以执行相同的操作。那么,右外连接有什么用呢? 请帮我解决这个问题。

【问题讨论】:

  • 对于两个表,您可以颠倒表的顺序并从left <-> right切换连接类型,它在语义上是相同的。但是,当涉及多个表时,情况并非如此。 I give an example of that here

标签: sql


【解决方案1】:

left outer joinright outer join 在某种意义上是多余的。您可以只使用其中一个来编写查询。

提供它们的原因与提供<> 的原因相同。有时,对于给定的逻辑操作,一种或另一种更有意义。

就我而言,我努力只使用joinleft outer join 编写查询。 left outer join 对我来说更有意义,因为它说“保留第一个表中的所有行,以及其他表中的匹配行”。这并不意味着right outer join 是错误的,只是不同的人理解事物的方式不同。

【讨论】:

  • 确实,你可以用LEFTINNER 做任何事情,当然,但我很少发现混合LEFTRIGHTINNER 我可以在查询中显示一种依赖流。那几次,我特别注意写下解释。我认为这句话是加入自己的时间。笛卡尔逻辑当然会变成一场噩梦
  • @LuisLL 。 . .我给你点赞。我在 SQL 方面非常熟练,拥有多年编写相当复杂的查询和使用其他人的代码的经验。然而,每当我看到from 子句中混合了不同类型的连接时,我都会停下来认真思考哪些记录来自哪里,哪些正在被过滤——除非所有连接都相同。
  • known note -- 当我写这篇文章时,只有上帝和我明白我在做什么。现在只有上帝知道。我在处理 SQL 奇怪的查询方面非常有经验,而且我的经验表明我必须提前花时间处理这些事情,因为如果没有,当我需要回到它们时,我会花更多的时间来说服自己该查询确实完成了我当时打算完成的工作...
【解决方案2】:

区别很简单——在左外连接中,将显示“左”表中的所有行,而不管“右”表中是否有任何匹配列。在右外连接中,将显示“右”表中的所有行,而不管“左”表中是否有任何匹配的列。希望我们上面给出的示例也有助于澄清这一点。

我应该使用右外连接还是左外连接? 其实,没关系。右外连接不会添加左外连接没有的任何功能,反之亦然。要从右外连接和左外连接获得相同的结果,您所要做的就是切换表在 SQL 语句中出现的顺序。

【讨论】:

    【解决方案3】:

    SELECT * from TableA LEFT JOIN TableB 如同 SELECT * from TableB RIGHT JOIN TableA

    SELECT * FROM TableA LEFT JOIN TableB TableA 中的所有行和 TableB 中的匹配行。如果在 TableB 中没有找到匹配的行,则 TableB 的所有列都将被替换为 null

    示例: 表 A 行 1 2 3 表 B 行 2 3 4

    TableA LEFT JOIN TableB 将给出以下元组: (1 空) (2 2) (3 3)

    TableA RIGHT JOIN TableB 将给出以下元组: (2 2) (3 3) (NULL 4)

    TableA OUTER JOIN TableB 以下元组: (1 空) (2 2) (3 3) (NULL 4)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-01
      • 2017-02-26
      • 2014-02-24
      • 2023-04-04
      • 2011-05-23
      • 2011-06-10
      相关资源
      最近更新 更多