【问题标题】:can anyone please explain this left join output? I am new to this谁能解释一下这个左连接输出?我是新来的
【发布时间】:2020-08-18 17:34:56
【问题描述】:

我有两张表,只有一列。

p1 (id - 1,1,null)
p2(id - 1,1,null, null)

当我在做左连接时

(select * from p1 left join p2 on p1.id = p2.id) 

我得到 5 行

(1,1,1,1.null) 

我希望得到 4 行。 请解释原因。

【问题讨论】:

  • 我认为你不明白为什么你会得到 1 的 4 行。您获得的第 5 行是表 p1 中带有 null 的行。在左连接中,返回左表的所有行。
  • 左连接会先返回你左表的所有行,也就是3,然后是右表的所有匹配行,对于'1'的每一行,你会找到2个匹配的行正确的表,所以总共5(2行匹配第一个'1',2行匹配第2个'1',最后1个不匹配NULL)
  • sqlfiddle.com/#!9/33e6845/8 基本上,你不能加入NULL
  • 你也得到了一个 cross join - p1 中值为 1 的每一行都匹配 p2 中的 2 行。使用更好的样本数据会更容易理解这一点。
  • 你认为你会得到哪 行?查看join 两侧的两个 列。你没有得到什么?

标签: sql join left-join


【解决方案1】:

原因是 4 行用于 ID = 1,即 P1 中的每个 ID = 1 将与 P2 中值为 1 的两行连接,同样,P1 中的第二个 1 将再次与 P2 中的 2 行连接。

第 5 行是 Null。

【讨论】:

    【解决方案2】:

    SQL 左连接基本上是一种连接,它将左表上的索引与右表加上左表的所有未匹配记录匹配。 现在,当您没有重复行时,左连接非常简单

    从图中可以看出,左右表各有5条记录,其中3条匹配。所以 SQL 左连接将返回所有匹配的记录加上所有不匹配的记录,我们的最终答案将是

    C罗、梅西、齐达内、特里和博格巴

    如果在你的情况下,如果在正确的表中有重复记录会发生什么

    .

    现在,由于梅西和齐达内各有 2 条记录,左连接将返回梅西和齐达内的两条记录,因此最终输出将是

    C罗、梅西、梅西、齐达内、齐达内、特里和博格巴

    希望,我能够帮助您澄清疑问

    【讨论】:

      猜你喜欢
      • 2021-02-27
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      相关资源
      最近更新 更多