2014-10-28 58 views
5

這個簡單的SQL外連接有什麼問題?左外連接B如何返回比A中更多的行?

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

它可以是列兩行b不是整個關鍵? – Jens 2014-10-28 12:04:06

+0

+1我會檢查。這怎麼能解釋310176? – Drux 2014-10-28 12:04:48

+2

如果b只是鍵的一部分,它可能是A中的一行在B中引用了更多的行,並且如果在您的示例1中有A參考的記錄12,0 ... B中的行,則可以得到結果。 – Jens 2014-10-28 12:07:50

回答

14

如果列在表B中不唯一,則可能發生這種情況。假設你有這樣的數據:

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

當您從A左加盟Bb列,你

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

,其給出了總三排,即使兩個AB只有每行兩列。

+0

+1是的,'B'的select count(distinct b)返回197,197 << 1242。 – Drux 2014-10-28 12:11:01

3

它沒有什麼奇怪的(這種情況也適用於內連接)。左外連接:

  • 返回的所有行的交叉B中加入條件匹配
  • ,並從那裏連接條件返回所有行以最低的查詢不匹配

所以將返回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的一行

相關問題