sql:如何查找重复行?

时间:2010-12-14 15:23:09

标签: sql sql-server

我有一个表用户(id,first_name,last_name,...) 我想在该表中找到重复的用户(具有相同first_name和相同last_name的用户)。

让我说我的数据是:

 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

谢谢

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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的解决方案可能总体上要好得多。