Requete suppression de doublon sous oracle

Soyez le premier à donner votre avis sur cette source.

Snippet vu 47 427 fois - Téléchargée 16 fois

Contenu du snippet

Cette requête SQL permet de supprimer les doublons d'une table sous n'importe quelle condition exemple : colonne 1 + colonne 2
cette requête laisse la première occurrence et supprime les autres.

Source / Exemple :


DELETE FROM My_Table
               WHERE ROWID IN (
                            SELECT ROWID
                            FROM   ( SELECT ROWID, ROW_NUMBER ( ) OVER ( PARTITION BY col1 || col2 ORDER BY col1 || col2 ) num_ligne
                                    FROM   My_Table ) t2
                            WHERE  num_ligne > 1 );

A voir également

Ajouter un commentaire

Commentaires

Un grand merci, la requête fonctionne très bien sous Oracle 11g R2 avec des dates.
Messages postés
7
Date d'inscription
vendredi 15 février 2002
Statut
Membre
Dernière intervention
19 décembre 2012

pour ROCODIDO
je suit désolé pour le retard ,
avant tout tu doit voir si la partie PARTITION est correct cad
select id_pere||date_debut||id_fils||date_fin
FROM tmp t
WHERE ....
ORDER BY id_pere , date_debut , id_fils, date_fin;

pour voir la concaténation
de plus avec un champ date je vous conseil de toujours le formaté

voici ton requête :
SELECT t2.*
FROM (SELECT t.*
, Rowid
, Row_Number( )
OVER ( PARTITION BY id_pere || to_char(date_debut,'yyyymmddHH24miss') || id_fils || to_char(date_fin,'yyyymmddHH24miss')
ORDER BY
id_pere
, date_debut
, id_fils
, date_fin )
num_ligne
FROM tmp t WHERE id_pere 1130451 AND id_fils 1084944 AND date_debut >= '01/05/2012' AND date_debut < '01/06/2012') t2
Messages postés
1
Date d'inscription
jeudi 1 décembre 2011
Statut
Membre
Dernière intervention
9 octobre 2012

Parfait merci !
Messages postés
2
Date d'inscription
mercredi 11 juillet 2012
Statut
Membre
Dernière intervention
11 juillet 2012

J'ai mis des virgules au lieu des || car Oracle transformait le champ date en JJ/MM/YYYY et donc la clé n'était plus la même et pas unique
Messages postés
2
Date d'inscription
mercredi 11 juillet 2012
Statut
Membre
Dernière intervention
11 juillet 2012

Bonjour

Ca ne fonctionne pas chez moi, j'ai 4 champs qui me sert de clé dont 2 qui sont des dates. Pour une ligne qui n'est pas en doublon, la requete remonte un num_ligne = 2 donc cette ligne serait supprimée à tord.

select t2.* from (select t.*, rowid, row_number () over (partition by id_pere||date_debut||id_fils||date_fin order by id_pere, date_debut, id_fils, date_fin) num_ligne from tmp twhere id_pere 1130451 and id_fils 1084944 and date_debut >= '01/05/2012' and date_debut < '01/06/2012'
) t2
Afficher les 10 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.