2014-04-23 87 views
0

我需要從我的表(user_info)中刪除重複項。我總是希望從下面的select/having查詢返回的兩行中較低的id列刪除行。有關如何編寫刪除語句以從下面的select/having查詢結果中刪除重複項(較低的user_info.id列)的任何想法?我正在使用Oracle 11g。刪除重複的行數據

user_info表中結構:

id (unique primary key number 10 generated by sequence) 
user_id (number 10) 
first_name (varchar2) 
last_name (varchar2) 

數據例如:

id  user_id 
______ ___________ 
37265 1455 
265798 1455 

SQL顯示重複:

select user_id, count(*) 
    from user_info 
group by user_id 
HAVING count(*) > 1 
+0

可以有2個以上的重複行嗎? –

+0

不,最多隻有2個。 – c12

回答

1

開始與這個給你,只顯示重複

Select user_id, count(*) NumRows, Min(Id) SmallestId, Max(Id) LargestId 
From user_info 
Group by user_id 
HAVING count(*) > 1 

這將顯示每個user_id的最小值和最大值(與SmallestId和LargestId相同的值,如果沒有重複。

Select user_id, count(*) NumRows, Min(Id) SmallestId, Max(Id) LargestId 
From user_info 
Group by user_id 

對於用戶,您希望保留MaxId並刪除其他所有內容。所以,你可以寫一個DELETE語句是

DELETE From user_info 
Where Id Not IN 
(
    Select Max(Id) 
    From user_info 
    Group by user_id 
) 

這將得到

2

您可以使用下面的查詢:

DELETE 
FROM user_info 
WHERE id NOT IN 
    (SELECT MAX(id) 
    FROM user_info 
    GROUP BY user_id); 

這個查詢將刪除除user_id行的所有重複的行最大值爲id

這裏是一個SQL Fiddle它演示刪除。

+0

@MarshallTigerus感謝您的反饋。 OP確實希望「刪除重複項(較低的user_info.id列)」因此,兩個ID中較大的一個將被保留。 –

0
drop table test; 
/

create table test 
(
ids number, 
user_id number 
); 
/


insert into test 
values(37265,1455); 
/

insert into test 
values(265798,1455); 
/


select * from test; 

delete from test t 
where t.ids < (select max(ids) from test t1 where T1.USER_ID= T.USER_ID) 

此查詢使用子查詢做同樣的事!