Sql 删除重复的行数据

Sql 删除重复的行数据,sql,oracle,Sql,Oracle,我需要从我的表用户信息中删除重复项。我始终希望删除id列在下面的select/having查询返回的两行中较低的行。关于如何编写delete语句以从下面我的select/having查询的结果中删除重复的lower user_info.id列,您有什么想法吗?我正在使用Oracle 11g 用户信息表结构: 数据示例: 要显示重复项的sql: 从这里开始,只显示重复项 Select user_id, count(*) NumRows, Min(Id) SmallestId, Max(Id) La

我需要从我的表用户信息中删除重复项。我始终希望删除id列在下面的select/having查询返回的两行中较低的行。关于如何编写delete语句以从下面我的select/having查询的结果中删除重复的lower user_info.id列,您有什么想法吗?我正在使用Oracle 11g

用户信息表结构:

数据示例:

要显示重复项的sql:


从这里开始,只显示重复项

Select user_id, count(*) NumRows, Min(Id) SmallestId, Max(Id) LargestId
From user_info
Group by user_id
HAVING count(*) > 1 
这将显示每个用户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
)

这将获得从这个开始的

仅显示重复项

Select user_id, count(*) NumRows, Min(Id) SmallestId, Max(Id) LargestId
From user_info
Group by user_id
HAVING count(*) > 1 
这将显示每个用户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
)

这将得到您可以使用以下查询的

DELETE 
FROM user_info
WHERE id NOT IN
    (SELECT MAX(id)
    FROM user_info
    GROUP BY user_id);
此查询将删除除id最大的用户id行以外的所有重复行


下面是一个演示删除的示例。

您可以使用以下查询:

DELETE 
FROM user_info
WHERE id NOT IN
    (SELECT MAX(id)
    FROM user_info
    GROUP BY user_id);
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)
此查询将删除除id最大的用户id行以外的所有重复行

下面是一个演示删除的示例

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)
此查询使用子查询执行相同的操作


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

重复行是否可以超过2行?不,最多只能有2行。重复行是否可以超过2行?不,最多只能有2行。@MarshallTigerus感谢您的反馈。OP确实希望删除重复的下用户\ u info.id列,以便保留两个id中较大的一个。@MarshallTigerus感谢您的反馈。OP确实希望删除“重复”下的“用户信息”列,以便保留两个id中较大的一个。