左外连接B如何返回比A中更多的行?

时间:2014-10-28 12:00:44

标签: sql sql-server database outer-join

这个简单的SQL外连接有什么问题?

select count(*) from A -- 25766
select count(*) from B -- 1242
select count(*) from A left outer join B on A.b = B.b -- 310176

分别返回25766,1242和310176行。 (这适用于Microsoft SQL Server 2012.)A left outer join B如何返回比A中存在的行更多的行,特别是给出this维恩图?我想我犯的是一个愚蠢的错误,但它是什么?

2 个答案:

答案 0 :(得分:14)

当表b中的B列不唯一时,可能会发生这种情况。假设您有这些数据:

  A      B
+---+  +---+---+
| b |  | b | c |
+---+  +---+---+
| 1 |  | 2 | 1 |
| 2 |  | 2 | 2 |
+---+  +---+---+

当您从列A上的B左侧加入b时,您将获得

+-----+------+------+
| A.b | B.b  | B.c  |
+-----+------+------+
|   1 | NULL | NULL |
|   2 |    2 |    1 |
|   2 |    2 |    2 |
+-----+------+------+

总共有三行,即使AB都只有两行。

答案 1 :(得分:3)

它没有什么奇怪的(这种情况也适用于内连接)。左外连接:

  • 返回连接条件匹配的交叉B中的所有行
  • 并返回连接条件不匹配的A中的所有行

所以至少查询将返回25766行,但可能会有更多。表A中可能有一行与表B中的许多行匹配。示例:

A             B             Result
+----+----+  +-----+----+   +------+-----+-----+------+
|  id|   b|  |   id|   b|   |  a.id|  a.b|  b.b|  b.id|
+----+----+  +-----+----+   +------+-----+-----+------+
|   1|  10|  |  123|  10|   |     1|   10|   10|   123|
+----+----+  |  456|  10|   |     1|   10|   10|   456|
             +-----+----+   +------+-----+-----+------+

即使表A中有一行,也会返回两行。