2010-01-07 91 views
0

我有一個表格式如下:SQL重複使用不同的主鍵

id | firstname | lastname 
---+-----------+---------- 
1 | alex  | marti 
2 | mark  | finger 
3 | alex  | marti 
4 | ted  | port 

需要以這種形式返回firstnamelastname重複:

1 | alex  | marti 
3 | alex  | marti 

我試圖做select firstname, lastname from t group by firstname, lastname having count(*) > 1但將返回類似於

firstname | lastname 
----------+---------- 
mark  | finger 
alex  | marti 
ted  | port 

而且我需要id的重複,但當然select id, firstname, lastname from t group by id, firstname, lastname將無法​​正常工作。

任何想法?謝謝。

+0

目前公認的答案是有限的,看http://stackoverflow.com/questions/2019039/sql-duplicates-with-different-primary-keys/2019058#2019058這是一個_correct_實現。 (雖然不是我的首選技術。) – 2010-01-07 10:42:07

回答

3

您需要聚合的ID。如果你需要其中一人只有ID,因爲,比如說,刪除,你可以這樣做:

select max(id) id, firstname, lastname from t group by firstname, lastname having count(*) > 1 

如果你想這兩個ID,知道永遠不會有超過2,你可以做到以下幾點:

select min(id) minid, max(id) maxid, firstname, lastname from t group by firstname, lastname having count(*) > 1 

如果你想要所有的重複,連同他們的id,你必須使用派生表,就像在Nitin Midha的答案中一樣。

+0

非常感謝你 – 2010-01-07 08:29:20

+0

不! #1顯然不是所要求的,#2只支持2個重複,但獲得OP要求的信息無論有多少重複都是微不足道的。 – 2010-01-07 10:35:44

+1

我會同意#2很少適用,但如果是的話,那會比使用派生表更好的表現,所以我想要展示這種替代方案。我會相信OP來處理它是否符合描述的判斷。至於#1:它可能是真的,它不符合原始問題的確切要求,但當這個問題如彈出時,10次中有9次,*想要什麼*(不管什麼是*問對於*)是一種簡單的方法來刪除這些重複的項目,爲此,#1將足夠多的時間。 – 2010-01-07 10:47:14

0
Select Id, First_Name, Last_Name 
FROM 
(
Select Id, First_Name, Last_Name, 
Count() Over (Partition By First_Name,Last_Name) Count 
From Emp 
) AS T 
Where T.Count > 1 
+0

我確定這是非標準的SQL – Timothy 2010-01-07 08:25:06

+0

使用SQL 2005及更高版本附帶的分析函數。 – 2010-01-07 08:31:30

3
select a.* from t a, 
(select first, last from t group by first, last having count(*) > 1) b 
where a.first = b.first and a.last = b.last 
+0

這是實現它的方法之一。基本上所有_correct_解決方案都要求您將重複結果集(名字,姓氏)返回到原始表格。 – 2010-01-07 10:40:30

1
select id, firstname, lastname 
from table t 
where exists (select 1 
from table t2 
where t2.firstname = t.firstname 
and t2.lastname = t.lastname 
and t2.id <> t.id) 
+0

這一個也很好地工作...基本上選擇任何行,你可以找到任何重複與不同的ID。 – 2010-01-07 10:44:50

0

我遇到了同樣的問題,這是我所做的解決它。 首先我確定複本用下面的查詢:

SELECT COUNT(*) as num, ID, Firstname, Lastname FROM TableA GROUP BY ID, Firstname, Lastname; 

然後創建一個臨時表。稱爲TempTableA 它與TableA具有相同的列,而額外的列稱爲Dups,您將看到爲什麼會更進一步。

然後我做了以下插入:

INSERT INTO TempTableA(Dups, ID, Firstname, Lastname) SELECT COUNT(*) as num, ID, Firstname, Lastname FROM TableA GROUP BY ID, Firstname, Lastname having count(*)>=1; 

現在,你可能知道爲什麼我們添加了名爲DUP的一個額外的列。 anywho ..

之後,我做了以下delete語句:

DELETE FROM TableA Where ID NOT IN (SELECT t.ID FROM TempTableA t); 

而急的是爲我做的工作移除複本的其餘部分。

它不是一個一步的過程,但它確實做了正確的工作。

注意:您需要將tableA更改爲正確的名稱以及列名以使其工作。 如果遇到任何問題,請告知我。

0
--Remove Duplicate Rows with different ID SQL SERVER 

CREATE TABLE #TempTable 
(
    Id  int, 
    Firstname varchar(20), 
    Lastname varchar(20) 
) 

INSERT INTO #TempTable(Id, Firstname, Lastname) SELECT min(Id)as Id, Firstname, Lastname 
FROM UserTable 
GROUP BY Firstname, Lastname 

delete from UserTable where Id not in(select Id from #TempTable) 

drop #TempTable 
0

,你可以做以下來顯示所有的ID列的值

SELECT GROUP_CONCAT(DISTINCT id SEPARATOR ',') AS ids, firstname, lastname FROM t GROUP BY firstname, lastname HAVING COUNT(*) > 1 

這應該顯示是這樣的:

ids | firstname | lastname 
----+-----------+---------- 
1,3 | alex  | marti