IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Suppression de doublons


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 114
    Par défaut Suppression de doublons
    Bonjour,
    Je vous explique mon problème,
    j'ai une table d'une dizaine de champs dans laquelle je souhaiterais supprimer des données :

    Extrait de ma table:
    INDIV | LIBL | IDENT | Adres |etc
    200 pole 1212 rue
    200 3 rue
    555 impasse
    655 pole impasse
    Mon souhait serait de supprimer tous les doublons (par rapport au code indiv) et de garder la ligne ou le Libl='pole' qd il existe ou Libl='' qd il n'est pas renseigné.

    J'espère avoir été assez clair.
    Merci

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Par défaut
    essais ceci:avant de supprimer fait la requête Select suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select * from matable
    where indiv in (Select indiv from matable
                        Where exists (Select indiv,count(*) from matable tb
                                            where matable.indiv=tb.indiv
                                            group  by indiv
                                            havig count(*)=2
                                           )
                    )
    et si le resultat te convient tu peux supprimer avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    delete from matable
    where indiv in (Select indiv from matable
                       where exists (Select indiv,count(*) from matable tb
                                          where matable.indiv=tb.indiv
                                         group  by indiv
                                         havig count(*)=2
                                         )
                       )

  3. #3
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 114
    Par défaut
    Salut,
    merci pour ta réponse
    le problème est que la requête identifie et récupère tous les INDIV qui sont présents plusieurs fois et donc si je fais un delete par la suite je les efface tous.
    Mon objectif est de garder la ligne parmi les doublons qui a un champ LIBL='pole'

    exemple:
    INDIV | LIBL | IDENT | Adres |etc
    200 .....pole... 1212 .....rue
    200 ................3.........rue
    555 ...........................impasse
    555................221.......impasse
    655 ......pole............... impasse
    Sur cet exemple il faudrait que je récupère par exemple pour l' :
    INDIV="200" la ligne de données pour laquelle LIBL="pol"
    INDIV="555" peu importe la ligne puisque LIBL n'est pas renseignée et que j'efface l'une des deux lignes

    Je sais pas si j ai été clair
    En tout cas merci encore pour ta réponse

  4. #4
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Août 2009
    Messages : 107
    Par défaut
    Si tu as moyen, je pense qu'il faut passer par du plsql

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Par défaut
    Dans ce cas dans tatable il faut qu'il y est au moins un champ qui différencie les doublons sinon chose impossible.
    Sauf s'il y a possiblité avec le rownum mais il faut que je regarde de ce
    côté-ci.
    De ton côté nous confirmer s'il y a un champs qui différencie et qu'il n'ya pas de condition sur la suppression du doubon(n'importe qu'elle ligne)

  6. #6
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 114
    Par défaut
    Le champ qui différencie mes lignes est le champ LIBL='pole' ou vide.
    Donc deux cas se présentent :
    1)
    plusieurs lignes dont une avec un champ LIBL='pole' (les autres ont le champ LIBL vides et different sur un troisieme champ VAL)
    Dans ce cas il faut supprimer toutes les lignes et recuperer la ligne qui a le Champ LIBL='pole'

    2)
    plusieurs lignes mais aucunes de ces lignes n'a un champ LIBL='pole' (LIBL est vide et elles se differencient sur le Champ VAl)
    Dans ce cas la , il me faut récupérer une seule de ces lignes peu importe la quelle
    MErci

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Par défaut
    Waldar que donnera ta solution si nous ajoutons une ligne

    exemple:
    INDIV | LIBL | IDENT | Adres |etc
    200 .....pole... 1212 .....rue
    200 ................3.........rue
    555 ...........................impasse
    555................221.......impasse
    655 ......pole............... impasse
    700............................rue

    La ligne 700 ne devra pas être supprimé.

    Si ceci fonctionne alors tu peux considérer cette solution elle plus simple, l'autre demandera un autre select imbriqué.

    Nous attendons pour voir.

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    J'utiliserais une fonction de fenêtrage pour mettre à 1 les lignes que vous voulez conserver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    WITH MaTable AS
    (
    select 200 as indiv, 'pole' as libl, 1212 as ident, 'rue' as adres from dual union all
    select 200         , null          ,    3         , 'rue'          from dual union all
    select 555         , null          , null         , 'impasse'      from dual union all
    select 555         , null          ,  221         , 'impasse'      from dual union all
    select 655         , 'pole'        , null         , 'impasse'      from dual
    )
    select indiv, libl, ident, adres,
           row_number() over(partition by indiv order by case libl when 'pole' then 1 else 0 end desc, libl asc, ident asc, adres asc) as rn 
      from MaTable;
     
    INDIV	LIBL	IDENT	ADRES	RN
    200	pole	1212	rue	1
    200		3	rue	2
    555		221	impasse	1
    555			impasse	2
    655	pole		impasse	1
    Ensuite on peut s'appuyer par exemple sur le rowid pour supprimer tous les éléments dont RN > 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    delete from MaTable
    where rowid in 
        (select ri
           from (select rowid as ri,
                        row_number() over(partition by indiv order by case libl when 'pole' then 1 else 0 end desc, libl asc, ident asc, adres asc) as rn 
                   from MaTable)
          where rn > 1);

  9. #9
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 114
    Par défaut
    Bonjour,
    Merci pour les réponses, voici ma requête :
    "SELECT indi,lib,prod,orien,code,
    row_number() over(partition BY indi ORDER BY case lib when 'Identifiant Pôle Emploi' then 1 else 0 end DESC, lib ASC, prod ASC, orien ASC, code ASC) AS rn
    FROM RSA_fin;"
    il s'agit de la version 8 d'oracle.
    A+

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Exécutez la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from sys.v_$version;
    Effectivement la fonction ROW_NUMBER() n'est arrivée qu'en 8i Enterprise Edition.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Suppression de doublons et insertion
    Par Samish dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/08/2005, 21h57
  2. Réponses: 17
    Dernier message: 03/12/2004, 11h17
  3. [langage] Suppression de doublon dans tableau
    Par LFC dans le forum Langage
    Réponses: 5
    Dernier message: 15/04/2004, 14h08
  4. Requête de suppression de doublons : besoin d'aide
    Par biocorp dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2004, 17h04
  5. [LG]Suppression de doublons
    Par moustique31 dans le forum Langage
    Réponses: 5
    Dernier message: 20/12/2003, 21h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo