左外连接查询在 SQL Server 中返回重复项

san*_*ndr 3 sql left-join duplicates

我有一个表 1 ( MID, SSN, ...)MID是主键,表 2 ( ID, SSN, StateCode..)IDSSN主键。我试图显示表 1 中的所有列以及StateCode表 2 中与其匹配的所有列SSN。表 1 有 50 行,其中一些具有相同的SSN值。

如果SSN从表2中找不到匹配项,则显示NULLStateCode是可以接受的,所以我选择左连接。这是我的查询

Select 
    tbl1.*, tbl2.StateCode
from 
    tbl1
left outer join 
    tbl2 on tbl1.SSN = tbl2.SSN
Run Code Online (Sandbox Code Playgroud)

我想要检索 50 条记录,但在 tbl1 中得到 70 条包含相同 ssn 值的行,最终在最终输出中出现重复。出了什么问题?

For*_*esR 5

我建议阅读笛卡尔积

如果第一个表中有 50 行,第二个表中有 70 行,则总共 3500 行。连接条件tbl1.SSN = tbl2.SSN将过滤掉行,但您最终可能会得到超过 50 行。

回到您的问题,您可以通过尝试以下操作来了解发生了什么:

SELECT 
  tbl1.*,
  (SELECT COUNT(*) FROM tbl2 WHERE tbl1.SSN = tbl2.SSN) AS NbResultTbl2
FROM 
  tbl1
Run Code Online (Sandbox Code Playgroud)

这将告诉 中的哪些行tbl1有多个匹配tbl2。如果列中的数字大于 1,NbResultTbl2那么最终会出现重复项。

要消除这些重复项,您可以尝试以下操作:

SELECT 
  tbl1.*,
  (SELECT TOP 1 StateCode FROM tbl2 WHERE tbl1.SSN = tbl2.SSN) 
FROM 
  tbl1  
Run Code Online (Sandbox Code Playgroud)

这将在 tbl2 中找到第一个StateCode匹配的 SNN。