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

Langage SQL Discussion :

Supprimer les duplications


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 175
    Points : 64
    Points
    64
    Par défaut Supprimer les duplications
    Bonjour à Tous,

    J'ai des tables qui contiennent des centaines des milliers des enregistrements avec cette structure (Id, nom, titre, ville). J'ai essayé de supprimer les duplications par la création d'un nouveau table et ensuite en utilisant une requête de type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     insert into table_new... select distinct(id), nom, titre, ville from table_originale..
    mais toujours sans vain !! EN effet, j'ai remarqué que seuls des enregistrements sont supprimés alors que d'autres ne sont pas supprimé. Apparemment cette fonction distinct n'est valable que pour un nombre limité d’enregistrements mais pour des tables ayant des centaines de milliers elle n'est pas si fiable !

    Toute information sera le bien venue et Merci d'avance .

  2. #2
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    il faut d'abord comprendre le principe de distinct.
    distinct evite les lignes identiques et non pas les champs.
    c'est à dire: (Id, nom, titre, ville)=ligne.
    tu peux nous donner un jeu de données afin de t'aider.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 175
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par islamov2000 Voir le message
    il faut d'abord comprendre le principe de distinct.
    distinct evite les lignes identiques et non pas les champs.
    c'est à dire: (Id, nom, titre, ville)=ligne.
    tu peux nous donner un jeu de données afin de t'aider.
    Oui je sais bien le principe. En effet elle va me retourner des enregistrements distincts n'ayant pas des doubles du clé id dans mon exemple. Mais pratiquement ça me rends des enregistrement qui ont des id identiques !!

  4. #4
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Si tu as des id identiques, c'est que pour un même id, au moins l'une des autres colonnes du SELECT a au moins deux valeurs différentes.

    Id, nom, titre, ville
    1, 'toto', 'titre1', 'Saint-Étienne'
    1, 'toto', 'titre1', 'Saint Etienne'

    Ce sont deux lignes différentes donc un SELECT DISTINCT Id, nom, titre, ville retournera les deux lignes.
    Et mettre Id entre parenthèses n'y changera rien car DISTINCT opère sur toutes les colonnes du SELECT.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 175
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Si tu as des id identiques, c'est que pour un même id, au moins l'une des autres colonnes du SELECT a au moins deux valeurs différentes.

    Id, nom, titre, ville
    1, 'toto', 'titre1', 'Saint-Étienne'
    1, 'toto', 'titre1', 'Saint Etienne'

    Ce sont deux lignes différentes donc un SELECT DISTINCT Id, nom, titre, ville retournera les deux lignes.
    Et mettre Id entre parenthèses n'y changera rien car DISTINCT opère sur toutes les colonnes du SELECT.
    ah bon ! alors il faur faire quoi ? Avez-vous une idée svp ?

  6. #6
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Tu veux supprimer les doublons sur l'id ?
    Quel(s) critère(s) détermine(nt) quelles valeurs conserver pour les autres colonnes ?

    Dans mon exemple, la bonne orthographe est Saint-Étienne mais rien ne permet de déterminer a priori qu'il faut conserver la première ligne et jeter la seconde, sauf l'examen humain des deux lignes.

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 175
    Points : 64
    Points
    64
    Par défaut
    Je veux supprimer les lignes ayant un ID identique, peu importe les valeurs des autres colonnes !Après, Je vais sauvegarder ces enregistrement dans une table ayant la colonne ID comme clé primaire

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 284
    Points : 12 986
    Points
    12 986
    Par défaut
    Bonjour,
    Dans ce cas il suffit que la requête renvoie l'id, applique une fonction d'aggrégation sur les autres colonnes(min ou max, je pense qu'AVG risque de ne pas trop aimer les chaines ), et grouper le tout sur l'Id.

    Tatayo.

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 175
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Dans ce cas il suffit que la requête renvoie l'id, applique une fonction d'aggrégation sur les autres colonnes(min ou max, je pense qu'AVG risque de ne pas trop aimer les chaines ), et grouper le tout sur l'Id.

    Tatayo.
    Pourriez-vous donner plus des détails svp ? J'ai pas bien compris l'idée. j'ai voulu ajouter que Id est de type var (ils sont des longs chiffres comme 105994040, 105994045 ...)

  10. #10
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT id, 
    	MAX(nom) AS nom,
    	MAX(titre) AS titre,
    	MAX(ville) AS ville
    FROM table_originale
    GROUP BY id

  11. #11
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par daniel1985 Voir le message
    Pourriez-vous donner plus des détails svp ? J'ai pas bien compris l'idée. j'ai voulu ajouter que Id est de type var (ils sont des longs chiffres comme 105994040, 105994045 ...)
    Si j'ai bine compris vous vous lister les id en double ?

    Si c'est le cas, la requête suivante devrait donner le résultat escompté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id, count(id) as count_id
    FROM theTable
    GROUP BY id
    having count(id) > 1;

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Si votre but est de "nettoyer" votre table, vous pouvez directement supprimer de la table les données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ;WITH CTE AS (
    	SELECT ROW_NUMBER() OVER(PARTITION BY id ORDER BY (SELECT 1)) AS Rang
    	FROM LaTable
    )
    DELETE FROM CTE
    WHERE Rang > 1
    (ici c'est fait de façon tout à fait arbitraire, car visiblement vous n'avez aucune règle indiquant quelle ligne supprimer en cas de doublon, mais au moins vous gardez la cohérence des valeurs entre les colonnes d'une même ligne...). Si vous voulez néanmoins implémenter une règle de suppression, vous pouvez le faire dans la partie ORDER BY de la fonction fenêtrée

Discussions similaires

  1. SAS EG 5.1 - Supprimer les duplications de programme
    Par Polmart dans le forum Outils BI
    Réponses: 2
    Dernier message: 17/09/2014, 11h41
  2. Comment supprimer les doublons
    Par djelloulc dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 17/09/2013, 15h30
  3. Réponses: 9
    Dernier message: 06/11/2007, 13h36
  4. [Jsp] Supprimer les caractère spéciaux d'une chaine
    Par PeteMitchell dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 13/05/2004, 12h11
  5. [String] Comment supprimer les accents
    Par iuz dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 08/03/2004, 03h58

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