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 :

[SQL Server] Requete qui affiche les doublons


Sujet :

Langage SQL

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Points : 733
    Points
    733
    Par défaut [SQL Server] Requete qui affiche les doublons
    Comment créer une requete qui affiche les doublons (pour permettre a l'utilisateur de voir et de supprimer les lignes inutiles.

    ex:

    ID Nom Code
    1 gg 55
    1 hh 55
    2 ggg 22
    3 gg 22
    5 ff 44
    5 gg 12

    Avec ce code je sais quel sont les ID concernées par les doublons

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT ID
    FROM Table
    GROUP BY ID
    HAVING Count(ID) >1
    Maintenant j'aimerais savoir comment afficher ces 2 enregistrements, par le biais d'une vue pour permettre a l'utilisateur de supprimer la ligne non désirée...

    exemple de résultat :
    1 gg 55
    1 hh 55
    5 ff 44
    5 gg 12
    N'oubliez pas de mettre le

  2. #2
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    j'suis vert !

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Points : 733
    Points
    733
    Par défaut
    Je t'avoue que j'ai déja lu cet article et que je ne comprend pas comment appliquer cela a mon probleme...
    N'oubliez pas de mettre le

  4. #4
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     SELECT ID,NOM,CODE FROM TABLE SYNONYME1
    WHERE EXISTS (
        SELECT ID FROM TABLE SYNONYME2 
        WHERE SYNONYME1.ID=SYNONYME2.ID
        GROUP BY ID
        HAVING Count(ID) >1
    )
    Réponse non testée.

    ++
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  5. #5
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    ou peut étre ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * FROM Table WHERE ID IN 
    (SELECT ID
    FROM Table
    GROUP BY ID
    HAVING Count(ID) >1)

  6. #6
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Les requêtes avec IN sont moins performantes que les requêtes utilisant EXISTS.

    Pour le débat sur IN et EXISTS je vous ramène à cettez archive et notamment le détail du plan d'exécution de la requête effectué par FRED_D
    http://www.developpez.net/forums/arc...p/t-11261.html
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  7. #7
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    En fait, je dis peut-être une ânerie... Je vais tester cela sur ma base, car EXISTS s'arrête à la première occurence contrairement au IN. Je fais des tests comparatifs ce midi et posterait la réponse.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  8. #8
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    et bien j'apprends quelque chose.
    et il est vrai que je n'ai pas l'habitude d'utiliser exist

    Merci Alexandre

  9. #9
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Points : 733
    Points
    733
    Par défaut
    Merci beaucoup je teste ca direct je vous dis quoi...

    Je ne comprenait pas bien la facon de 'joindre' en quelques sortes mes deux requets, celle qui donne les valeurs ID des doublons et l'autre qui affiche ceux ci...
    N'oubliez pas de mettre le

  10. #10
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Création de la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE TEST_EXIST (
    ID_TEST INTEGER NOT NULL,
    NOM_TEST VARCHAR(32),
    COD_TEST CHAR(4)
    );
    Création de l'index
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE INDEX NDX_ID_INDEX ON TEST_EXIST ( ID_TEST );
    Jeu d'essai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    INSERT INTO TEST_EXIST (ID_TEST,NOM_TEST,COD_TEST) VALUES (1,'LIGNE 001','L001');
    INSERT INTO TEST_EXIST (ID_TEST,NOM_TEST,COD_TEST) VALUES (2,'LIGNE 002','L002');
    INSERT INTO TEST_EXIST (ID_TEST,NOM_TEST,COD_TEST) VALUES (3,'LIGNE 003','L003');
    INSERT INTO TEST_EXIST (ID_TEST,NOM_TEST,COD_TEST) VALUES (4,'LIGNE 004','L004');
    INSERT INTO TEST_EXIST (ID_TEST,NOM_TEST,COD_TEST) VALUES (1,'DOUBLON 001 LIGNE 001','L005');
    INSERT INTO TEST_EXIST (ID_TEST,NOM_TEST,COD_TEST) VALUES (1,'DOUBLON 002 LIGNE 001','L006');
    INSERT INTO TEST_EXIST (ID_TEST,NOM_TEST,COD_TEST) VALUES (2,'DOUBLON 001 LIGNE 001','L007');
    INSERT INTO TEST_EXIST (ID_TEST,NOM_TEST,COD_TEST) VALUES (2,'DOUBLON 002 LIGNE 001','L008');
    INSERT INTO TEST_EXIST (ID_TEST,NOM_TEST,COD_TEST) VALUES (4,'DOUBLON 001 LIGNE 001','L009');
    Requête de sélection avec EXISTS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT ID_TEST,NOM_TEST,COD_TEST
      FROM TEST_EXIST SYNONYME1
     WHERE EXISTS (
       SELECT ID_TEST
         FROM TEST_EXIST SYNONYME2 
       WHERE SYNONYME1.ID_TEST=SYNONYME2.ID_TEST
       GROUP BY ID_TEST
       HAVING Count(ID_TEST) >1
    );
    Résultat de la sélection avec EXIST
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    +---------+-----------------------+----------+
    | ID_TEST | NOM_TEST              | COD_TEST |
    +---------+-----------------------+----------+
    |       1 | LIGNE 001             | L001     |
    |       2 | LIGNE 002             | L002     |
    |       4 | LIGNE 004             | L004     |
    |       1 | DOUBLON 001 LIGNE 001 | L005     |
    |       1 | DOUBLON 002 LIGNE 001 | L006     |
    |       2 | DOUBLON 001 LIGNE 001 | L007     |
    |       2 | DOUBLON 002 LIGNE 001 | L008     |
    |       4 | DOUBLON 001 LIGNE 001 | L009     |
    +---------+-----------------------+----------+
    8 rows in set (0.02 sec)
    Sélection avec IN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT ID_TEST,NOM_TEST,COD_TEST
      FROM TEST_EXIST SYNONYME1
     WHERE SYNONYME1.ID_TEST IN (
          SELECT ID_TEST
            FROM TEST_EXIST SYNONYME2
        GROUP BY ID_TEST
          HAVING Count(ID_TEST) >1
    );
    Résultat de la sélection avec IN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    +---------+-----------------------+----------+
    | ID_TEST | NOM_TEST              | COD_TEST |
    +---------+-----------------------+----------+
    |       1 | LIGNE 001             | L001     |
    |       2 | LIGNE 002             | L002     |
    |       4 | LIGNE 004             | L004     |
    |       1 | DOUBLON 001 LIGNE 001 | L005     |
    |       1 | DOUBLON 002 LIGNE 001 | L006     |
    |       2 | DOUBLON 001 LIGNE 001 | L007     |
    |       2 | DOUBLON 002 LIGNE 001 | L008     |
    |       4 | DOUBLON 001 LIGNE 001 | L009     |
    +---------+-----------------------+----------+
    8 rows in set (0.03 sec)
    Plan d'exécution avec EXISTS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    +----+--------------------+-----------+------+---------------+-------------+---------+------------------------+------+--------------------------+
    | id | select_type        | table     | type | possible_keys | key         | key_len | ref                    | rows | Extra                    |
    +----+--------------------+-----------+------+---------------+-------------+---------+------------------------+------+--------------------------+
    |  1 | PRIMARY            | SYNONYME1 | ALL  | NULL          | NULL        | NULL    | NULL                   |    9 | Using where              |
    |  2 | DEPENDENT SUBQUERY | SYNONYME2 | ref  | NDX_ID_TEST   | NDX_ID_TEST | 4       | test.SYNONYME1.ID_TEST |    1 | Using where; Using index |
    +----+--------------------+-----------+------+---------------+-------------+---------+------------------------+------+--------------------------+
    Plan d'exécution avec IN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    +----+--------------------+-----------+-------+---------------+-------------+---------+------+------+-------------+
    | id | select_type        | table     | type  | possible_keys | key         | key_len | ref  | rows | Extra       |
    +----+--------------------+-----------+-------+---------------+-------------+---------+------+------+-------------+
    |  1 | PRIMARY            | SYNONYME1 | ALL   | NULL          | NULL        | NULL    | NULL |    9 | Using where |
    |  2 | DEPENDENT SUBQUERY | SYNONYME2 | index | NULL          | NDX_ID_TEST | 4       | NULL |    9 | Using index |
    +----+--------------------+-----------+-------+---------------+-------------+---------+------+------+-------------+
    Un truc me chiffone dans le retour du plan d'exécution de ma requête avec le IN : Possible Keys : NULL et KEY : NDX_ID_TEST ....

    Qqn peut-il testé ces valeurs sur un autre SGBD que MySQL ? J'ai utilisé une syntaxe la plus normative possible.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  11. #11
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Apparement sous SQL SERVER il utilise aussi l'index dans les deux cas...
    (Cf image du plan d'execution en pièce jointe)
    Images attachées Images attachées  
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  12. #12
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    617
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 617
    Points : 733
    Points
    733
    Par défaut
    Merci avec EXISTS Ca marche SUPER

    Un grand merci a vous
    N'oubliez pas de mettre le

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

Discussions similaires

  1. [Joomla!] Retrouver la requete SQL qui affiche les modules dans la zone admin
    Par vladock dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 04/10/2012, 12h12
  2. [MySQL 3.23.41]Requete qui affiche les 6 derniers mois
    Par nanarou dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/09/2006, 19h07
  3. Réponses: 3
    Dernier message: 11/05/2006, 17h30
  4. [SQL Server] Requete récupérant les 2 max
    Par Franck2mars dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/04/2006, 13h45
  5. Afficher les doublons SQL
    Par kotoji dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/01/2005, 17h32

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