【问题标题】:"On" left join order“开”左连接顺序
【发布时间】:2019-03-27 17:54:11
【问题描述】:

我已经阅读了 20 多篇类似标题的帖子,但未能找到答案,如果有答案,请提前致歉。

我一直相信

select * FROM A LEFT JOIN B on ON A.ID = B.ID

相当于

select * FROM A LEFT JOIN B on ON B.ID = A.ID

但今天被告知“既然你有左连接,你必须将它作为 A = B,因为翻转它将充当内连接。

这是真的吗?

【问题讨论】:

  • 否 .. A.ID = B.ID 或 B.ID = A.ID 是相同的 .. 如果更改表的顺序,则查询更改 ... FROM A LEFT JOIN B 是与 FROM B LEFT JOIN A 不同.. 因为集合涉及更改
  • 投票箭头鼠标悬停文本地址研究。您支持或反对他们的主张或支持或反对他们主张的论点是什么? (为什么要阅读帖子而不是左连接和内连接的权威参考定义?)
  • “因为”引出了这个问题。他们没有给出一个合理的论点——从最初的假设到明显的基本有效逻辑重新排列的一系列真理。他们对左连接和内连接的定义有何吸引力? (甚至,它们运行了什么 1 说明执行?)每个连接的定义只涉及为表的交叉连接的每一行评估一个 on 条件整体,并且不受翻转的影响。 PS 了解什么是左连接返回:行内连接加上由空值扩展的不匹配左表行。作为左连接的一部分,始终知道您想要什么样的内连接。

标签: sql outer-join


【解决方案1】:

谁告诉你不明白 JOIN 和连接条件是如何工作的。他/她完全错了。

表格的顺序对于左连接很重要。 a left join bb left join a 不同,但是连接条件的顺序是没有意义的。

【讨论】:

  • 我觉得自己像个白痴,我很高兴这不是真的。这对 HQL 来说可能是真的吗?
  • @user8834780 那将是一个新问题:)
  • 将您的示例重新写入 HQL 并仍然有效:)
【解决方案2】:

A.ID = B.ID 是表连接的条件并返回TRUEFALSE
因为相等(=) 是commutative,所以操作数的顺序不会影响结果。

【讨论】:

    【解决方案3】:

    它们是完全不正确的,证明是微不足道的。

    DECLARE @A TABLE (ID INT)
    DECLARE @B TABLE (ID INT)
    
    INSERT INTO @A(ID) SELECT 1
    INSERT INTO @A(ID) SELECT 2
    
    INSERT INTO @B(ID) SELECT 1
    
    SELECT *
    FROM @A a
    LEFT JOIN @B b ON a.ID=b.ID
    
    SELECT *
    FROM @A a
    LEFT JOIN @B b ON b.ID=a.ID
    

    表的顺序很重要(A Left JOIN B 与 B LEFT JOIN A),如果使用 OR,则连接条件组的顺序很重要(A=B OR A IS NULL AND A IS NOT NULL - 始终使用括号加上 OR),但在条件组中(例如 a.ID=b.ID)并不重要。

    【讨论】:

      猜你喜欢
      • 2017-12-08
      • 2017-07-01
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多