我正在尝试编写一个显示表中所有重复项的查询。
我有一张桌子,我们称之为工人。该表有多列;我关注的两个叫做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”,但我不相信我可以将该功能应用于一列。
答案 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
)
您可以轻松修改此项以更改“重复”的定义 - 例如,如果有多个不同的员工编号。