【问题标题】:Why is this left outer join include rows twice?为什么这个左外连接包含两次行?
【发布时间】:2022-11-03 22:39:07
【问题描述】:

在以下情况下:

CREATE TABLE Persons (
    groupId int,
    age int,
    Person varchar(255)
);

insert into Persons (Person, groupId, age) values('Bob'  , 1     , 32);
insert into Persons (Person, groupId, age) values('Jill'  , 1     , 34);
insert into Persons (Person, groupId, age)values('Shawn'  , 1     , 42);
insert into Persons (Person, groupId, age) values('Shawn'  , 1     , 42);
insert into Persons (Person, groupId, age) values('Jake'  , 2     , 29);
insert into Persons (Person, groupId, age) values('Paul'  , 2     , 36);
insert into Persons (Person, groupId, age) values('Laura'  , 2     , 39);

以下查询:

SELECT *
FROM `Persons` o                    
  LEFT JOIN `Persons` b             
      ON o.groupId = b.groupId AND o.age < b.age

返回(在http://sqlfiddle.com/#!9/cae8023/5 中执行):

1   32  Bob 1   34  Jill
1   32  Bob 1   42  Shawn
1   34  Jill    1   42  Shawn
1   32  Bob 1   42  Shawn
1   34  Jill    1   42  Shawn
1   42  Shawn   (null)  (null)  (null)
1   42  Shawn   (null)  (null)  (null)
2   29  Jake    2   36  Paul
2   29  Jake    2   39  Laura
2   36  Paul    2   39  Laura
2   39  Laura   (null)  (null)  (null). 

我不明白结果。
我期待

1   32  Bob 1   34  Jill
1   32  Bob 1   42  Shawn
1   34  Jill    1   42  Shawn
1   42  Shawn   (null)  (null)  (null)
2   29  Jake    2   36  Paul
2   29  Jake    2   39  Laura
2   39  Laura   (null)  (null)  (null)

我期待的原因是,在我的理解中,左连接从左表中选择每一行,尝试匹配右表的每一行,如果有匹配,它会添加该行。如果条件中没有匹配项,它会为右列添加带有空值的左行。
所以如果这是正确的,为什么在小提琴输出中我们有 1 34 Jill 1 42 Shawn Bob 和 Jill 的行重复了吗?

【问题讨论】:

    标签: mysql sql join outer-join


    【解决方案1】:

    您加入行的条件是 groupId 相等且 o.age &lt; b.age

    Bob 的年龄是 32 岁。这小于 Jill 的 34 岁。也小于 Shawn 的 42 岁。因此在两对连接行中满足条件。

    连接的行包含引用为o 的行中的所有列以及引用为b 的行中的所有列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-08
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 2018-04-16
      相关资源
      最近更新 更多