san*_*ndr 3 sql left-join duplicates
我有一个表 1 ( MID, SSN, ...)MID是主键,表 2 ( ID, SSN, StateCode..)ID是SSN主键。我试图显示表 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 值的行,最终在最终输出中出现重复。出了什么问题?
我建议阅读笛卡尔积。
如果第一个表中有 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。
| 归档时间: |
|
| 查看次数: |
15244 次 |
| 最近记录: |