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 :

Afficher la liste des doublons


Sujet :

SQL Oracle

  1. #1
    Membre actif
    Afficher la liste des doublons
    Bonjour,
    ça fais un moment que je cherche à afficher la liste des doublons, dans une requete sql, mais pas moyen, pourtant j'ai beau regarder les différents sujets, mais je n'arrive pas à faire ma requete.

    Initialement , j'ai fais une requete permettant de compter le nombre de doublons par personne, donc qui ont une date d'enregistrement >1, ma requete est comme ceci :

    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
     
    select   count(t6.dateEnregistrement), ta.identifiant,t6.dateEnregistrement,ta2.NOM_personne
     
    from Tableconge2 t6
     
     
    inner join dossiers_2 t5 on t6.IDrefT4 = t5.id 
    inner join dossiers_1 t4 on t4.id=t5.C211_IDrefT5  
    inner join annee tAnnee on tAnnee.ID = t4.tAnnee
    inner join groupe4 ta on ta.id = t4.idrefTa
    inner join personne ta2 on ta2.ID = ta.X503_IDrefTa
     
    where tAnnee.annee in (2017,2018)  
    and  t6.dateEnregistrement <>to_date('31/12/2999','dd/mm/yyyy')
     
    group by ta.identifiant,t6.dateEnregistrement,ta2.NOM_personne   
    having count(t6.dateEnregistrement)>1


    là j'ai un resultat sous la forme :
    3 -- 9885454 -- 05/06/2017 00:00:00 -- philipe debreuille
    2 -- 4555555-- 06/06/2017 00:00:00 -- croc odile
    8 -- 00021111-- 09/06/2017 00:00:00 -- Gery Cane

    Pour philipe debreuille, j'ai 3 doublons en date du 05/06/2017
    croc odile j'ai 2 doublon
    gery cane j'ai 8 doublons

    et j'aimerais avoir , enfin modifié ma requete ( pour en faire une a part ) pour qu'il me sorte la liste :
    9885454 -- 05/06/2017 00:00:00 -- philipe debreuille
    9885454 -- 05/06/2017 00:00:00 -- philipe debreuille
    9885454 -- 05/06/2017 00:00:00 -- philipe debreuille
    4555555-- 06/06/2017 00:00:00 -- croc odile
    4555555-- 06/06/2017 00:00:00 -- croc odile
    00021111-- 09/06/2017 00:00:00 -- Gery Cane
    00021111-- 09/06/2017 00:00:00 -- Gery Cane
    00021111-- 09/06/2017 00:00:00 -- Gery Cane
    00021111-- 09/06/2017 00:00:00 -- Gery Cane
    00021111-- 09/06/2017 00:00:00 -- Gery Cane
    00021111-- 09/06/2017 00:00:00 -- Gery Cane
    00021111-- 09/06/2017 00:00:00 -- Gery Cane
    00021111-- 09/06/2017 00:00:00 -- Gery Cane

    avec ma 1ere requete j'ai 200 resultats, là c'est ok

    J'ai cherché, j'ai beau enlevé le count rien dans mon select, rien n'y fait.
    Le problème est que : si j'enlève mon having et group by, j'ai bien ma liste de personne, y compris celle qui sont en doublons mais je me retrouve avec ....... 120 000 résultats et là c'est pas bon..
    J'avais pensé à faire une sous requete, en gros faire un select etc..... qui me retourne les 120 k de resultats et faire un:
    where dateEnregistrement not in ( select ..... from ..... where... group by dateEnregistrement havingcount(date)>1) mais j'ai pas l'impression que ça marche, auriez vous quelques conseils ?

    un grand merci à vous

  2. #2
    Expert éminent
    Suffit de faire ton select sans group by avec une jointure sur ton select avec group by... Euh en fait c'est moins clair en l'écrivant en français

    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
    19
    20
    21
    SELECT ta.identifiant, t6.dateEnregistrement, ta2.NOM_personne
    FROM Tableconge2 t6
    INNER JOIN dossiers_2 t5 ON t6.IDrefT4 = t5.ID 
    INNER JOIN dossiers_1 t4 ON t4.ID=t5.C211_IDrefT5  
    INNER JOIN annee tAnnee ON tAnnee.ID = t4.tAnnee
    INNER JOIN groupe4 ta ON ta.ID = t4.idrefTa
    INNER JOIN personne ta2 ON ta2.ID = ta.X503_IDrefTa
    WHERE tAnnee.annee IN (2017,2018)  
    AND  t6.dateEnregistrement <>TO_DATE('31/12/2999','dd/mm/yyyy')
    AND (ta.identifiant, t6.dateEnregistrement, ta2.NOM_personne)
          IN (SELECT xta.identifiant, xt6.dateEnregistrement, xta2.NOM_personne
              FROM Tableconge2 xt6
              INNER JOIN dossiers_2 xt5 ON xt6.IDrefT4 = xt5.ID 
              INNER JOIN dossiers_1 xt4 ON xt4.ID=xt5.C211_IDrefT5  
              INNER JOIN annee xtAnnee ON xtAnnee.ID = xt4.tAnnee
              INNER JOIN groupe4 xta ON xta.ID = xt4.idrefTa
              INNER JOIN personne xta2 ON xta2.ID = xta.X503_IDrefTa
              WHERE xtAnnee.annee IN (2017,2018)  
              AND  xt6.dateEnregistrement <>TO_DATE('31/12/2999','dd/mm/yyyy')
              GROUP BY xta.identifiant,xt6.dateEnregistrement,xta2.NOM_personne   
              HAVING COUNT(xt6.dateEnregistrement)>1)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB

  3. #3
    Membre actif
    merci mais ça ne fonctionne pas :s , j'ai pris un exemple avec un identifiant d'une personne ça me retourne :
    01/08/17 00:00:00,000000000 12345678
    12/02/18 00:00:00,000000000 12345678
    30/04/18 00:00:00,000000000 12345678
    30/04/18 00:00:00,000000000 12345678

    et je souhaiterais avoir que :
    30/04/18 00:00:00,000000000 12345678
    30/04/18 00:00:00,000000000 12345678

    voici la requete que j'ai mise :

    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
    19
    20
    21
    22
     
    SELECT t6.dateEnregistrement, ta.identifiant
    FROM Tableconge2 t6
    INNER JOIN dossiers_2 t5 ON t6.IDrefT4 = t5.ID 
    INNER JOIN dossiers_1 t4 ON t4.ID=t5.C211_IDrefT5  
    INNER JOIN annee tAnnee ON tAnnee.ID = t4.tAnnee
    INNER JOIN groupe4 ta ON ta.ID = t4.idrefTa
    INNER JOIN personne ta2 ON ta2.ID = ta.X503_IDrefTa
    WHERE tAnnee.annee IN (2017,2018)  
    AND  t6.dateEnregistrement <>TO_DATE('31/12/2999','dd/mm/yyyy')
    AND t6.dateEnregistrement
          IN (SELECT t6.dateEnregistrement
              FROM Tableconge2 xt6
              INNER JOIN dossiers_2 xt5 ON xt6.IDrefT4 = xt5.ID 
              INNER JOIN dossiers_1 xt4 ON xt4.ID=xt5.C211_IDrefT5  
              INNER JOIN annee xtAnnee ON xtAnnee.ID = xt4.tAnnee
              INNER JOIN groupe4 xta ON xta.ID = xt4.idrefTa
              INNER JOIN personne xta2 ON xta2.ID = xta.X503_IDrefTa
              WHERE xtAnnee.annee IN (2017,2018)  
              AND  xt6.dateEnregistrement <>TO_DATE('31/12/2999','dd/mm/yyyy')
              GROUP BY xta.identifiant,xt6.dateEnregistrement,xta2.NOM_personne   
              HAVING COUNT(xt6.dateEnregistrement)>1)

  4. #4
    Expert éminent
    Bein si tu modifies la requêtes .. comment veux-tu que ça fonctionnes
    L'alias des tables est importants t6 = table du haut.. xt6 = table du bas (groupée), là tu fais and t6. in (select t6. )
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    AND t6.dateEnregistrement IN (SELECT t6.dateEnregistrement      FROM Tableconge2 xt6


    Ensuite tu fais un groupement sur 3 colonnes, faut faire la jointure sur les 3 colonnes.

    Et enfin, pour bien voir les lignes dans l'ordre, mettre un tri.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB

  5. #5
    Membre actif
    Merci

  6. #6
    Membre actif
    problème pour identifier les doublons
    Bonjour,
    j'ai un problème similaire, sur une requête , j'ai ma requête de base suivant :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT t1.identifiant,
    d1.numcontrat 
    FROM personne t1
    INNER JOIN contrat d1 ON d1.numcontrat = t1.id

    ici on a la liste des personnes avec leur numéros de contrat, jusque là ok, mais ce que je souhaite établir, c'est la liste des personnes en doublon, sur un même numéro de contrat, donc par exemple :
    identifiant numcontrat
    123456 800000123529
    123456 800000123529
    123456 800000123529
    6598 800054523529

    donc en gros je souhaiterais que ma requête retourne que les 3 premières ligne.

    Quand je fais une requete avec un having je n'ai pas le résultat escompté, je sais qu'il y a une subtilité avec ça mais j'arrive pas à la trouver :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT t1.identifiant,
    d1.numcontrat 
    FROM personne t1
    INNER JOIN contrat d1 ON d1.numcontrat = t1.id
    GROUP BY d1.numcontrat,t1.identifiant
    HAVING count(*) > 1


    En gros si je comprends bien, je dois retourner la liste des enregistrements pour lesquels on a un même identifiant et un même numero de contrat, je ne dois pas avoir de ligne unique :s
    merci pour vos conseils

  7. #7
    Membre chevronné
    Pour afficher les doublons, il faut se demander ce que l'on veut afficher

    Les doublons en comptant leur occurrence par exemple :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
      t1.identifiant, d1.numcontrat, COUNT(*)
    FROM personne t1
      INNER JOIN contrat d1 
        ON d1.numcontrat = t1.id
    GROUP BY d1.numcontrat, t1.identifiant
    HAVING count(*) > 1

    Dans ce cas-là on ne ramène que les données en doublon.


    Tous les enregistrements liés à un doublon :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT *
    FROM personne t1
      INNER JOIN contrat d1 
        ON d1.numcontrat = t1.id
    WHERE EXISTS
      (SELECT NULL
      FROM personne t2
        INNER JOIN contrat d2 ON d2.numcontrat = t2.id
      WHERE t1.identifiant = t2.identifiant
      AND d1.numcontrat = d2.numcontrat
      GROUP BY d2.numcontrat,t2.identifiant
      HAVING count(*) > 1
      );

    Dans ce cas-ci on a le détail des données en situation de doublon.

  8. #8
    Membre actif
    Merci je vais tester cela

  9. #9
    Membre actif
    pour finir j'ai trouvé la solution, merci