我有一个表用户(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
谢谢
答案 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的解决方案可能总体上要好得多。