2017-02-24 36 views
0

让我们说,我有以下的列和数据两个简单的表:LEFT JOIN - 两个表使用相同的数据

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, 汤姆

+0

't1'没有'god'列。 –

+2

你应该得到2行。't1'中有两行与't2'中的两行完全匹配。你预期的输出是什么,你会得到4条记录?也许你正在将LEFT OUTER JOIN与CROSS JOIN混淆,你会得到一个笛卡尔产品? – JNevill

+0

我有点困惑,不应该查询查找在第二个表中的第一个表的主键上匹配的行吗?由于左连接总是要显示表1中的所有数据,为什么表2中的数据被丢弃(即使它是相同的)? Tom –

回答

2

一个经典的左连接会给你在“左表”的行数乘以在“右表”匹配的数量(一个从)(一在这种情况下为LEFT JOIN),加上LEFT表中第一个表中没有匹配的所有行。

  • 在左边的表中的行数= 2
  • 中右表的匹配总数= 1
  • 在左边的表中的行数withouth的匹配= 0

2×1 + 0 = 2

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

总和(row_i X matches_i)+无与伦比

哪里row_i是指每一行,并matches_i为在第一个表中第i行的比赛。与此不同的是,每行可能会有不同数量的匹配(前面的公式只适用于你的情况)

这将导致

1(ROW1)×1(比赛为第1行)+ 1(ROW2)X 1(用于行2)+ 0(在表1中不匹配的行)=导致

的1x1 + 1x1的+ 0 =导致

1 + 1 = 2 =导致

比赛

如果您预计有4行,您可能想获得笛卡尔积。如注释所述,您可以在此情况下使用交叉连接

+0

结论是正确的,但不是解释。第二张表的两行匹配。右表中的匹配数为2. –

+0

我更新了解释。无论如何,我从来没有说过,第二张桌子上有几排无与伦比的排 - 也许我不清楚我想说什么 –

0

您将得到两行,因为两列都有两行完全匹配山姆及其组合键。 如果你每行有4行,你将只能得到4行。

0

左连接将Table1(t1)作为左表。 它搜索并检索右侧的所有值,即: - 从表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

2

当您加入表一起,你基本上要求数据库的数据来自两个不同的表作为一个记录相结合并显示它。当您执行left join,你说:

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

在这个意义上,表2从数据不代表单独附加记录到Table 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| 
+------+-------+-------+   +------+-------+--------------+ 

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

0

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

left join on返回从(innerjoin on行,再加上你可以通过null对右边的参数列延长未连接左参数行让行。

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

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

(如果你left join是一个表格,它自身的条件是一列或多列左右版本的平等关系,并且在这些列中没有null s,那么每个左边的参数行都会与at因此只有(innerjoin on的行被返回。)