2010-12-14 65 views
0

我得到了一个表用户(id,first_name,last_name,...) 我想在该表中找到重复的用户(具有相同的first_name和相同的last_name的用户)。sql:如何找到重复的行?

比方说,我的数据是:

1;bill;campton 
2;sarah;connor 
3;bill;campton 

我需要得到

1;bill;campton;3;bill;campton 

我不想让

1;bill;campton;3;bill;campton 
    3;bill;campton;1;bill;campton 

我怎么能这样做呢? 我使用SQL Server 2005

谢谢

+0

count函数是查找重复行的简单方法 – 2010-12-14 16:06:47

回答

6

你可以使用:

select u1.id, u2.id, u1.first_name, u1.last_name 
from users u1 
inner join users u2 
on u1.first_name = u2.first_name 
and u1.last_name = u2.last_name 
where u2.id > u1.id 

或者,让你的6行,请使用

select u1.id, u1.first_name, u1.last_name, u2.id, u2.first_name, u2.last_name 

12

一种方式

select first_name, last_name 
from table 
group by first_name, last_name 
having count(*) > 1 

如果你想还的ID,那么你可以做到这一点

SELECT t1.* 
FROM table t1 
join 
(select first_name, last_name 
from table 
group by first_name, last_name 
having count(*) > 1) x ON t1.last_name = x.last_name 
AND t1.first_name = x.first_name 
0

给你说你想要的输出格式,这个工程:

select 
    o.id, 
    o.firstname, 
    o.lastname, 
    d.id, 
    d.firstname, 
    d.lastname 
from 
    users o 
    join users d on d.firstname = o.firstname and d.lastname = o.lastname and o.id < d.id 

注意,如果你有一个以上的重复,你会得到你可能不想要的结果,所以SQLMenace的解决方案可能整体上好得多。

1

我只是想出了这一点。这很简单。您可以使用公用表表达式和窗口分区。

本示例查找所有具有相同名称和DOB的学生。您要检查重复的字段进入分区。你可以在投影中包含你想要的其他领域。

with cte (StudentId, Fname, LName, DOB, RowCnt) 
as (
SELECT StudentId, FirstName, LastName, DateOfBirth as DOB, SUM(1) OVER (Partition By FirstName, LastName, DateOfBirth) as RowCnt 
FROM tblStudent 
) 
SELECT * from CTE where RowCnt > 1 
Order By DOB 
+0

我应该提到的是SQL Server 2005或更高版本。 – 2016-07-01 18:55:06