2010-12-14 66 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