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

MS SQL Server Discussion :

supprimer les lignes en double d'une table qui comporte plusieurs colonnes


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut supprimer les lignes en double d'une table qui comporte plusieurs colonnes
    Bonjour,

    J'ai une table qui comporte cinq champs, avec des enregistrements en double, je souhaiterai réaliser un select qui va extraire les données des cinq champs sans doublons.

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select champ1, champ2, champ3, champ4, champ5
    from ma_table 
    group by champ1, champ2, champ3, champ4, champ5

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Négatif

    SELECT Matricule, Prénom, Nom, Grade, Division, CIN
    FROM Table_IVP
    GROUP BY Matricule, Prénom, Nom, Grade, Division, CIN

    Ca m'affiche toujours des doublons, au fait je souhaiterai avoir les champs nom et prénom en distinct

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bename00 Voir le message
    SELECT Matricule, Prénom, Nom, Grade, Division, CIN
    Désolé mais pour moi ça fait SIX champs et vu votre demande succinct, comment j'aurais pu deviné les noms de colonnes ???

    Citation Envoyé par bename00 Voir le message
    Ca m'affiche toujours des doublons, au fait je souhaiterai avoir les champs nom et prénom en distinct
    Apprenez à exprimer votre besoin clairement.
    En premier, c'était les lignes distincts sur tous les 5 champs et maintenant, c'est sur 2 champs des 6...
    Jusqu'à présent la télépathie ne marche pas très bien.
    D'ailleurs, si vous aviez observé les règles du foru ( http://club.developpez.com/regles/ )
    vous auriez du nous fournir un jeu d'exemples et de résultat attendu ainsi que la structure de la table et ça éviterait ce jeu de ping pong / devinettes.

    Essayez ceci mais je ne vous empêche pas d'essayer de comprendre un peu et d'adapter ou d'essayer des choses...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Prénom, Nom
    FROM Table_IVP
    GROUP BY Prénom, Nom

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Négatif encore

    Désolé, je reformule ma question :

    J'ai une table qui comporte six champs :

    Matricule Prénom Nom Grade Division CIN
    1 Prénom1 Nom1 Grade1 Division1 CIN1
    2 Prénom2 Nom2 Grade2 Division2 CIN2
    3 Prénom3 Nom3 Grade3 Division3 CIN3
    1 Prénom1 Nom1 Grade1 Division1 CIN1
    1 Prénom1 Nom1 Grade1 Division1 CIN1
    1 Prénom1 Nom1 Grade1 Division1 CIN1
    2 Prénom2 Nom2 Grade2 Division2 CIN2

    Je souhaiterai extraire les six champs avec des enregistrements non double de sorte à avoir le résultat ci-dessous :

    Matricule Prénom Nom Grade Division CIN
    1 Prénom1 Nom1 Grade1 Division1 CIN1
    2 Prénom2 Nom2 Grade2 Division2 CIN2
    3 Prénom3 Nom3 Grade3 Division3 CIN3

    Votre première proposition du group by m'a donné un resultat avec doublons.
    Votre deuxième proposition ne m'arrangera pas puisque j'ai besoin des six champs.

    Vous dites : Essayez ceci mais je ne vous empêche pas d'essayer de comprendre un peu et d'adapter ou d'essayer des choses...

    Belle expression
    Ok, Merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    ça doit ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select Matricule , Prénom , Nom , Grade , Division , CIN
    from FROM Table_IVP
    group by Matricule , Prénom , Nom , Grade , Division , CIN
    Citation Envoyé par bename00 Voir le message
    Vous dites : Essayez ceci mais je ne vous empêche pas d'essayer de comprendre un peu et d'adapter ou d'essayer des choses...
    Belle expression
    Ok, Merci
    Effectivement, ce ne sont pas les tutoriels qui manquent concernant le SQL et les regroupements, rien que sur ce beau site...
    Et c'est toujours bien de comprendre ce que l'on fait, non ?

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select champ1, champ2, champ3, champ4, champ5
    from ma_table 
    group by champ1, champ2, champ3, champ4, champ5
    Outre la question mal posée, GROUP BY ne sert pas à filtrer les doublons, mais à retrouper les lignes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select distinct champ1, champ2, champ3, champ4, champ5
    from ma_table
    Est donc plus appropriée comme réponse à la question initiale.

    Donc au final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT Matricule , Prénom , Nom , Grade , Division , CIN
    FROM FROM Table_IVP
    Quite à utiliser GROUP BY pour n'importe quoi, pourquoi pas utiliser UNION aussi, qui fait un DISTINCT implicite...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Matricule , Prénom , Nom , Grade , Division , CIN
    FROM FROM Table_IVP
    union
    SELECT Matricule , Prénom , Nom , Grade , Division , CIN
    FROM FROM Table_IVP

  8. #8
    Invité
    Invité(e)
    Par défaut
    Excusez-moi, StringBuilder, je suis sûrement bien ignorant mais outre la différence de syntaxe entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT champ1, champ2, champ3, champ4, champ5
    FROM ma_table 
    GROUP BY champ1, champ2, champ3, champ4, champ5
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT champ1, champ2, champ3, champ4, champ5
    FROM ma_table
    C'est quoi la différence fondamentale ?
    D'autant plus que les temps et les plans d’exécution sont identiques...
    Pour moi, c'est une façon plus propre et plus explicite qu'un distinct.

    En outre, je peux aussi fournir bien des exemples de SQL tarabiscotés mais il me semble que ma requête répond correctement à la demande, je ne comprends pas vraiment votre point.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 87
    Points : 88
    Points
    88
    Par défaut
    Bonjour,

    Si c'est un problème de qualité de données non detecté/bloqué par des contraintes d'intégrités, vous pouvez nettoyer vos data simplement !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Ton_champs, COUNT(*)
    FROM Ta_Table
    GROUP BY Ton_champs
    HAVING COUNT(*)>1
    Vous avez alors toutes les lignes en doublons, vous pouvez les purger et réinsérer les bonnes données.


    Maintenant, moi j'ai fais un truc tout con :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE [dbo].[TABLE_TEST](
    	[MATRICULE] [int] NULL,
    	[PRENOM] [varchar](50) NULL,
    	[NOM] [varchar](50) NULL,
    	[GRADE] [varchar](50) NULL,
    	[DIVISION] [varchar](50) NULL,
    	[CIN] [varchar](50) NULL
    ) ON [PRIMARY]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (1, 'Prénom1', 'Nom1', 'Grade1', 'Division1', 'CIN1');
    INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (2, 'Prénom2', 'Nom2', 'Grade2', 'Division2', 'CIN2');
    INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (3, 'Prénom3', 'Nom3', 'Grade3', 'Division3', 'CIN3');
    INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (1, 'Prénom1', 'Nom1', 'Grade1', 'Division1', 'CIN1');
    INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (1, 'Prénom1', 'Nom1', 'Grade1', 'Division1', 'CIN1');
    INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (1, 'Prénom1', 'Nom1', 'Grade1', 'Division1', 'CIN1');
    INSERT INTO TABLE_TEST ([MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]) VALUES (2, 'Prénom2', 'Nom2', 'Grade2', 'Division2', 'CIN2');

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM TABLE_TEST
    WHERE MATRICULE IN (SELECT DISTINCT(MATRICULE) FROM TABLE_TEST)
    GROUP BY [MATRICULE],[PRENOM], [NOM], [GRADE], [DIVISION], [CIN]

    Voila

  10. #10
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Problème toujours pas résolu

    Les trois réponses affichent ceci :

    7gyY9w1ZY6ySRgPeaefZ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Matricule , Prénom , Nom , Grade , Division , CIN
    FROM  Table_IVP
    GROUP BY Matricule , Prénom , Nom , Grade , Division , CIN
    StringBuilder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT Matricule , Prénom , Nom , Grade , Division , CIN
    FROM Table_IVP
    Glouferu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM Table_IVP
    WHERE MATRICULE IN (SELECT DISTINCT(MATRICULE) FROM Table_IVP)
    GROUP BY [MATRICULE],[PRéNOM], [NOM], [GRADE], [DIVISION], [CIN]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Matricule , Prénom , Nom , Grade , Division , CIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1111	Prénom1	Nom1	1	1	CIN1
    1112	Prénom1	Nom1	1	1	CIN2
    1113	Prénom3	Nom3	1	1	CIN3
    1111	Prénom1	Nom1	2	1	CIN1
    1111	Prénom1	Nom1	3	1	CIN1
    Au fait, il manque un détail que je n'avais pas cité, et je m'en excuse profondément, c'est que les doublons d'enregistrements ne sont pas très identiques au niveau du champ grade.

    Je souhaiterai avoir la liste des six champs avec un distinct sur les champs nom et le prénom seulement.
    Si vous me dites, lequel des enregistrements en double je veux au final, je dirai ; n'importe lequel ...

    Mes remerciements

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bename00 Voir le message
    Au fait, il manque un détail que je n'avais pas cité, et je m'en excuse profondément, c'est que les doublons d'enregistrements ne sont pas très identiques au niveau du champ grade.
    Il faudrait définir la notion "pas très identiques" car le SQL ne contient pas d'opérateur de comparaison "not quite the same"...

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 87
    Points : 88
    Points
    88
    Par défaut
    Oui, si la valeur Grade est différente ... les lignes ne sont pas en doublons
    Bon pour ma part, je pense que le grade le plus élevé est celui en rigueur faute de date !


    Voici ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM TABLE_TEST AS T,
    	(SELECT MATRICULE, max(GRADE) as grade
    	FROM TABLE_TEST
    	GROUP BY MATRICULE) A
    WHERE A.MATRICULE = T.MATRICULE
    AND A.GRADE=T.GRADE

    P.S.: Avec les 2 3 exemples de requêtes SQL que j'ai pu vous donner sur ce topic, vous allez pouvoir répondre a 90% des besoins en matières de sélection. Donc essayez de bien comprendre la logique et tout deviendra plus simple pour vous



  13. #13
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Problème résolu

    Glouferu, votre solution est bien correct, juste un petit détail ; vu qu'un max grade d'une personne risque d'être en double aussi, le max ne fonctionnera pas, j'ai pensé alors a créer un id unique pour tout les enregistrement que j'ai, et je récupère le max ou le min id d'une personne puisque c'est un enregistrement au hasard qui m'intéresse.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  Mat , Prénom , Nom , Grade , Division , CIN
    FROM IVP AS T ,
    			(SELECT   MAX(id) AS id
    			FROM IVP
    			GROUP BY  Prénom, Nom ) A
    WHERE   T.ID = A.ID
    Je vous remercie énormément.

    Salutations

  14. #14
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
    Excusez-moi, StringBuilder, je suis sûrement bien ignorant mais outre la différence de syntaxe entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT champ1, champ2, champ3, champ4, champ5
    FROM ma_table 
    GROUP BY champ1, champ2, champ3, champ4, champ5
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT champ1, champ2, champ3, champ4, champ5
    FROM ma_table
    C'est quoi la différence fondamentale ?
    D'autant plus que les temps et les plans d’exécution sont identiques...
    La différence fondamentale, c'est que "distinct" retourne toutes les valeurs distinctes des tuples retournés par le select.

    Alors que group by effectue un regroupement des lignes en vue d'une utilisation conjointe avec une fonction de regroupement (min, max, etc.)
    Le fait que GROUP BY faisse un distinct est un effet de bord uniquement, et il ne doit jamais être utilisé pour ça. C'est comme les gens qui croient que le GROUP BY et le ORDER BY sont synonymes : le ORDER BY est un effet de bord du GROUP BY et du DISTINCT. Cependant, ce n'est pas systématique (lors d'une jointure noramment, l'ordre n'est pas toujours assuré) !

    Il s'agit donc d'une différence de sémantique.
    Citation Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
    Pour moi, c'est une façon plus propre et plus explicite qu'un distinct.
    Non, justement, puisque sémantiquement, il faut utiliser DISTINCT pour avoir des valeurs distinctes et GROUP BY pour avoir des valeurs groupées

    Le fait que le plan d'exécution et le résultat soit identique n'est qu'un "coup de chance" parceque pour un SGBD donné, dans une situation donnée, il va faire la même chose. Cela n'est en rien assuré.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 87
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par bename00 Voir le message
    Problème résolu

    Glouferu, votre solution est bien correct, juste un petit détail ; vu qu'un max grade d'une personne risque d'être en double aussi, le max ne fonctionnera pas, j'ai pensé alors a créer un id unique pour tout les enregistrement que j'ai, et je récupère le max ou le min id d'une personne puisque c'est un enregistrement au hasard qui m'intéresse.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT  Mat , Prénom , Nom , Grade , Division , CIN
    FROM IVP AS T ,
    			(SELECT   MAX(id) AS id
    			FROM IVP
    			GROUP BY  Prénom, Nom ) A
    WHERE   T.ID = A.ID
    Je vous remercie énormément.

    Salutations
    A la place de rajouter une nouvelle colonne à ta table, tu peux la créer aussi en mémoire pour ton traitement. Je te laisse regarder la fonction :


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

Discussions similaires

  1. Supprimer les lignes en double dans un fichier texte
    Par SilkyRoad dans le forum Contribuez
    Réponses: 1
    Dernier message: 01/05/2017, 15h09
  2. supprimer les 4 premiers caractères d'une table
    Par NeutronDance dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/10/2010, 15h58
  3. [XL-2003] Supprimer les cellules en double dans une colonne
    Par Mimosa777 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 06/05/2010, 21h49
  4. Supprimer les lignes en double
    Par illight dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 13/09/2007, 19h43
  5. [MySQL] Supprimer les informations des champs dans une table (suite)
    Par snakejl dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 26/05/2006, 15h37

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