2011-05-19 104 views
10

我有一个包含以下用户数据的大表。在SQL中查找重复记录

social security number 
name 
address 

我想在表中查找 其中SSN等于所有可能的重复,但名字不是

我的尝试是:

SELECT * FROM Table t1 
WHERE (SELECT count(*) from Table t2 where t1.name <> t2.name) > 1 

回答

14

上SSN一个分组应该这样做

SELECT 
    ssn 
FROM 
    Table t1 
GROUP BY 
    ssn 
HAVING COUNT(*) > 1 

..或者,如果你有每SSN很多行,只希望找到重名)

... 
HAVING COUNT(DISTINCT name) > 1 

编辑,哎呀,误解

SELECT 
    ssn 
FROM 
    Table t1 
GROUP BY 
    ssn 
HAVING MIN(name) <> MAX(name) 
+0

你的答案似乎s给我行的名字是相同的。我想要名称不相同的行 – Mark 2011-05-19 10:45:12

+0

@Mark:标题显示“找到重复项”,误导了我。纠正。 – gbn 2011-05-19 10:51:38

+0

我以为我会需要自我加入。我喜欢最小/最大的想法。谢谢 – Mark 2011-05-19 11:02:11

0

这将处理超过两个记录与重复ssn的:

select count(*), name from table t1, ( 
    select count(*) ssn_count, ssn 
    from table 
    group by ssn 
    having count(*) > 1 
) t2 
where t1.ssn = t2.ssn 
group by t1.name 
having count(*) <> t2.ssn_count