繁体   English   中英

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

[英]Left join - two tables with the same data

可以说我有两个带有以下列和数据的简单表:

Table 1               Table 2

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

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

因此,经典的左联接为我提供了左表中的所有数据以及右表中的匹配行。

如果我像这样左连接:

select 
t1.year, t2.month

from 
table1 t1
   left join table 2 t2 on (t1.year = t2.year and t1.month = t2.month)

为什么我只有两行? 我不应该得到4行吗?

Tnx,汤姆

传统的左联接将为您提供“左表”中的行数(从中输入)乘以“右表”中的匹配数(在这种情况下为LEFT JOIN中的行),再加上所有行LEFT表中的第一个表中没有匹配项。

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

2 x 1 + 0 = 2

编辑:实际上,乘法是为每一行给出的。 会像

总和(row_i xmatches_i)+不匹配

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

这将导致

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

1x1 + 1x1 + 0 =结果

1 + 1 = 2 =结果

如果您预期有4行,那么您可能想要获得笛卡尔积。 如评论所述,在这种情况下,您可以使用交叉联接

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

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

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

想象一下,表1存储了人员,表2存储了电话号码。

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

您可以将他们加入一起以获得人员列表及其相应的电话号码。 但是您不会期望从每个表中得到行的组合(两人和两行电话)。

您将获得两行,因为两列都具有与sam及其组合键完全匹配的2行。 如果每行中有4行,将以相同的方式进行操作,总共只有4行。

左联接将Table1(t1)作为左表。 它从Right中搜索并检索所有值,即:-从表2(t2)中匹配条件T1.Year&Month = T2.Year&Month(别名GOD / s)以及附加联接条件T1.Month = T2.Month。 结果是,T1中只有2行与联接条件以及其他联接条件匹配

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

左联接的结果

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

left join on收益从(行innerjoin on再加上你可以通过延长未连接的左参数行作出的行null的右参数列。

请注意,这与主键,唯一列集,外键或任何其他约束无关

这里每个参数有2行,因此cross join联接中有2 X 2 = 4行。 但是只有2个满足条件-行与自身结合在一起的条件。

(如果您将表与自身left join在一起,而条件是一列的左右版本的一个或多个相等性的合计,并且这些列中没有null ,则每个左参数行至少与自身相连接右参数。因此,没有不连接的左参数行。因此,仅返回( innerjoin on的行。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM