2014-04-23 2 views
0

Je dois supprimer les doublons de ma table (informations utilisateur). Je veux toujours supprimer la ligne avec la colonne id qui est inférieure des deux lignes renvoyées à partir de ma requête select/having ci-dessous. Des idées sur la façon d'écrire l'instruction delete pour supprimer les doublons (colonne user_info.id inférieure) des résultats de ma requête select/having ci-dessous? J'utilise Oracle 11g.Supprimer les données de ligne en double

structure de la table user_info:

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

exemple de données :

id  user_id 
______ ___________ 
37265 1455 
265798 1455 

sql pour montrer les doublons:

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

Peut-il y avoir plus de 2 lignes dupliquées? –

+0

non il n'y a que 2 max. – c12

Répondre

1

Commencez avec cela pour vous montrer que les doublons

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

Cela vous montre le min et max pour chaque user_id (avec la même valeur pour SmallestId et LargestId s'il n'y a pas de doublons.

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

Pour un utilisateur, vous souhaitez conserver le MaxId et tout supprimer. Vous pouvez donc écrire une déclaration SUPPRIMER être

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

Cela obtenir le

2

Vous pouvez utiliser la requête suivante:

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

Cette requête supprimera toutes les lignes en double, sauf la user_id ligne avec un maximum de id. Voici un SQL Fiddle qui illustre la suppression.

+0

@MarshallTigerus Merci pour vos commentaires. Le PO veut "supprimer les doublons (colonne lower user_info.id)". Donc, le plus grand des deux identifiants hs doit être conservé. –

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) 

Cette requête utilise la sous-requête pour faire de même!

Questions connexes