这个简单的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维恩图?我想我犯的是一个愚蠢的错误,但它是什么?
答案 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 | +-----+------+------+
总共有三行,即使A
和B
都只有两行。
答案 1 :(得分:3)
它没有什么奇怪的(这种情况也适用于内连接)。左外连接:
所以至少查询将返回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中有一行,也会返回两行。