【问题标题】:How can A left outer join B return more rows than are in A?A 左外连接 B 如何返回比 A 中更多的行?
【发布时间】:2014-12-23 19:51:50
【问题描述】:

这个简单的 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 维恩图?我想我犯了一个愚蠢的错误,但这是什么?

【问题讨论】:

  • 会不会是b列不是整个key?
  • +1 我会检查的。这如何解释 310176?
  • 如果 b 只是键的一部分,它可能是 A 中的一行引用 B 中的更多行,如果在您的示例中,A 的 1 条记录引用 12,0... 行B 你得到你的结果。
  • @Jens 我想这与 hvd 的答案相同,对吧?

标签: sql sql-server database outer-join


【解决方案1】:

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

甲乙 +---+ +---+---+ |乙 | |乙 | c | +---+ +---+---+ | 1 | | 2 | 1 | | 2 | | 2 | 2 | +---+ +---+---+

当您在列b 上从A 左加入到B 时,您会得到

+-----+------+------+ | A.b | BB |卑诗省 | +-----+------+------+ | 1 |空 |空 | | 2 | 2 | 1 | | 2 | 2 | 2 | +-----+------+------+

虽然AB 各只有两行,但总共给出了三行。

【讨论】:

  • +1 是,select count(distinct b) from B 返回 197,而 197
【解决方案2】:

这并不奇怪(这种情况也适用于内部连接)。左外连接:

  • 返回 A 和 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 中有一行,这也会返回两行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2021-03-16
    相关资源
    最近更新 更多