删除重复行数据

时间:2014-04-23 18:07:50

标签: sql oracle

我需要从我的表中删除重复项(user_info)。我总是希望删除id列的行,该列是从我的select / having查询返回的两行中较低的一行。有关如何编写delete语句以从下面的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 

3 个答案:

答案 0 :(得分:2)

您可以使用以下查询:

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

此查询将删除除user_id行以外的所有重复行,且最大id

这是一个 SQL Fiddle ,用于演示删除。

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

此查询使用子查询执行相同操作!