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 :

Afficher la liste des doublons


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut 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
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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 / QRCode et Images PNG ou BMP

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    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
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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 / QRCode et Images PNG ou BMP

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    Merci

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut 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é
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    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 averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    Merci je vais tester cela

  9. #9
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    pour finir j'ai trouvé la solution, merci

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

Discussions similaires

  1. Afficher la liste des connectés à une BDD
    Par GD91 dans le forum Access
    Réponses: 4
    Dernier message: 04/10/2006, 14h55
  2. Réponses: 7
    Dernier message: 21/08/2006, 13h58
  3. [commande DOS]: afficher la liste des tâches
    Par mathieu_r dans le forum Windows
    Réponses: 1
    Dernier message: 06/06/2006, 09h45
  4. afficher la liste des bases de données dans oracle
    Par dalio2579 dans le forum Oracle
    Réponses: 4
    Dernier message: 19/04/2006, 16h31
  5. [Tomcat] afficher la liste des attributs en session
    Par michaelbob dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 11/04/2006, 01h07

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