使用SQL查找重复项

时间:2014-02-25 00:32:38

标签: sql duplicates

我正在尝试编写一个显示表中所有重复项的查询。

我有一张桌子,我们称之为工人。该表有多列;我关注的两个叫做SocialSecurityNbr和EmpNbr。

我希望查询显示

所有的行
SocialSecNbr == SocialSecNbr 
AND 
EmpNbr != EmpNbr

下面我有一个我的数据示例,后面是我想要输出的内容。 (为了这个问题的简单性,我只用了4位数代表社会安全号码)

ID  EmpNbr  SocialSecNbr EmpName
1   00001   9711         Smith,John
2   00002   5789         Harris, Greg
3   00001   9711         Smith,John
4   00003   4100         Thompson,Lisa
5   00004   1250         Fulton,Kyle
6   00005   3999         Harris, Amber
7   00004   1250         Fulton,Kyle
8   00007   1250         Morlan,Richard
9   00008   3999         Levy,Harold

我希望看到输出:

ID  EmpNbr  SocialSecurityNbr EmpName
5   00004   1250              Fulton,Kyle
6   00005   3999              Harris, Amber
7   00004   1250              Fulton,Kyle
8   00007   1250              Morlan,Richard
9   00008   3999              Levy,Harold

如您所见,除了John Smith之外,所有重复的社会安全号码都显示在输出中。在实际的表格中,有很多情况下同一个人不止一次出现,这很好,我不知道结果会是什么。

我在网上搜索了有关如何执行此操作的信息,但我发现的只是使用“Count> 1”的示例。我想我需要使用“Distinct”,但我不相信我可以将该功能应用于一列。

3 个答案:

答案 0 :(得分:0)

至少对于ms-sql,加入表本身会起作用:

select distinct w1.ID, w1.EmpNbr, w1.SocialSecNbr, w1.EmpName
from WORKERS w1
inner join WORKERS s2 on w1.SocialSecNbr = s2.SocialSecNbr  
                         AND 
                         w1.EmpNbr  <> s2.EmpNbr 

对于其他sql风格,它应该也可以。

请参阅SqlFiddle

上的示例

答案 1 :(得分:0)

您可以使用exists子句来解决此问题:

select ID, EmpNbr, SocialSecurityNbr, EmpName
from workers w
where exists (select 1
              from workers w2
              where w2.SocialSecurityNbr = w.SocialSecurityNbr and
                    w2.EmpNbr <> w.EmpNbr
             );

使用workers(SocialSecurityNbr, EmpNbr)上的索引,这应该相对有效。

答案 2 :(得分:0)

下面的查询将显示WORK中所有行,其中SocSecurityNbr具有“重复”(由具有多个不同的EmpNames定义)。

SELECT *
FROM Workers
WHERE SocSecurityNbr IN (
    SELECT SocSecurityNbr
    FROM Workers
    GROUP BY SocSecurityNbr
    HAVING COUNT(DISTINCT EmpName) > 1
)

您可以轻松修改此项以更改“重复”的定义 - 例如,如果有多个不同的员工编号。