我需要从我的表中删除重复项(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
答案 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)
此查询使用子查询执行相同操作!