左连接 - 具有相同数据的两个表

时间:2017-02-24 18:09:15

标签: sql left-join

假设我有两个包含以下列和数据的简单表:

.blinked-in {
    transition: all 1s;
    -moz-transition: all 1s;
    -webkit-transition: all 1s;
        color: white;
        border: 1px solid transparent;
    background-color: black;
}
.blinked-in:hover {
    border: 1px solid #27a5d2;
    background-color: #e1f4f9;
    color: black;
}

主键是由年份和月份组成的复合键。

所以经典的左连接,给我左表中的所有数据以及右表中的匹配行。

如果我像这样做左联:

Table 1               Table 2

year   month          year month
2017   01             2017  01
2016   12             2016  12

为什么我只获得两排?难道我不能获得4行??

TNX, 汤姆

5 个答案:

答案 0 :(得分:2)

经典的左连接将为您提供“左表”中的行数(来自中的一个)乘以“右表”中的匹配数(在这种情况下LEFT JOIN中的匹配数) ),以及LEFT表中第一个表中没有匹配的所有行。

  • LEFT表中的行数= 2
  • 右表中的匹配数= 1
  • LEFT表中没有匹配的行数= 0
  

2 x 1 + 0 = 2

编辑:实际上每行都有乘法。会像

  

Sum(row_i x matches_i)+ unmatched

其中row_i表示每一行,match_i表示第一个表中i行的匹配项。与此不同的是,每一行可能具有不同的匹配数(前一个公式仅适用于您的情况)

这将导致

  

1(row1)x 1(匹配第1行)+ 1(第2行)x 1(匹配第2行)+   0(表1中不匹配的行)=结果

     

1x1 + 1x1 + 0 =结果

     

1 + 1 = 2 =结果

如果你期望4行,你可能想得到笛卡尔积。正如评论所述,在这种情况下您可以使用交叉连接

答案 1 :(得分:2)

当您将表连接在一起时,您实际上是要求数据库组合来自两个不同表的数据并将其显示为单个记录。当您执行left join时,您说:

  

给我Table1中的所有行,以及来自的任何相关数据   表2(如果存在)。

从这个意义上讲,Table2中的数据并不代表单独的附加记录到Table1(即使它们作为单独的记录存储在单独的表中),它代表关联的数据。您正在链接表之间的数据,而不是从每个表中追加行。

想象一下,Table1存储了人,而Table2存储了电话号码。

         Table1                           Table2
+------+-------+--------+         +------+-------+-------------+
| Year | Month | Person |         | Year | Month | Phone       |
+------+-------+--------+         +------+-------+-------------+
| 2017 |    12 | Bob    |         | 2017 |    12 | 555-123-4567|
| 2016 |    01 | Frank  |         | 2016 |    01 | 555-234-5678|
+------+-------+-------+         +------+-------+--------------+

您可以将他们加在一起,以获取人员及其相应电话号码的列表。但是你不希望得到每个表的行组合(两行人和两行电话号码)。

答案 2 :(得分:0)

您将获得两行,因为两列都有两行完全匹配sam及其复合键。 如果每行有4行,那么它将采用相同的方式,总共只能获得4行。

答案 3 :(得分:0)

Left Join将Table1(t1)作为Left表。 它搜索并检索右边的所有值,即: - 从表2(t2)匹配标准T1.Year& Month = T2.Year& Month(别名GOD / s)以及附加连接条件T1.Month = T2.Month。结果是,T1中只有2行符合连接条件以及其他连接条件

另一个要点:左连接上的AND T1.Month = T2.Month条件是多余的,因为复合GOD键明确地处理它。

Results of the Left Join

答案 4 :(得分:0)

cross join通过组合每个参数中的一行返回您可以创建的每一行。 (innerjoin on返回满足其条件的cross join行。即(innerjoin on返回您可以创建的每一行,它组合了每个参数的一行并满足其条件。

left join on返回(innerjoin on中的行以及您可以通过null为未绑定的左参数行扩展右侧参数列的行。< / p>

请注意,无论主键,唯一列集,外键还是任何其他约束,这都是

这里每个参数有2行,因此cross join中有2个X 2 = 4行。但只有2条符合条件 - 行与自身结合的条件。

(如果你left join一个自己的表,其中条件是列的左右版本的一个或多个等式的组合,并且那些列中没有null个左参数行至少从右参数连接起来。因此没有未连接的左参数行。因此只返回(innerjoin on的行。)