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 :

[Oracle] Recherche de doublons sur deux champs


Sujet :

Langage SQL

  1. #1
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut [Oracle] Recherche de doublons sur deux champs
    Bonjour,

    Je travaille Oracle mais je ne suis pas sûre que ca ait une grande importance.

    Je me pose une question relativement bête : je cherche les doublons dans une table Personne, sur le Nom ET le prénom.

    Alors j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
        NOM_PERSONNE+' '+PRENOM_PERSONNE AS DENOMINATION
    FROM
        PERSONNE
    GROUP BY
        DENOMINATION
    HAVING
        COUNT(NOM_PERSONNE) > 1
    Mais j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        DENOMINATION
        *
    ERREUR à la ligne 8 :
    ORA-00904: "DENOMINATION" : identificateur non valide
    Ligne 8 : C'est la ligne juste après le GROUP BY.
    J'ai l'impression qu'il ne veut pas que je fasse de group by sur un alias, comment pourrais-je résoudre ce problème ? Ou bien, où ai-je fait une erreur ?

    Merci d'avance !

    BiM

    [EDIT]Wouahou, c'est beau et coloré maintenant ^^ (le code)[/EDIT]

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 780
    Points
    30 780
    Par défaut
    S'il n'accepte pas les alias, répète l'expression dans le GROUP BY...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
        NOM_PERSONNE+' '+PRENOM_PERSONNE AS DENOMINATION
    FROM
        PERSONNE
    GROUP BY
        NOM_PERSONNE+' '+PRENOM_PERSONNE
    HAVING
        COUNT(NOM_PERSONNE) > 1
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 64
    Points : 75
    Points
    75
    Par défaut Le count(*)
    Essaye aussi cela, çà me parait mieux


    SELECT
    NOM_PERSONNE+' '+PRENOM_PERSONNE AS DENOMINATION , COUNT(*)
    FROM
    PERSONNE
    GROUP BY
    NOM_PERSONNE+' '+PRENOM_PERSONNE
    HAVING
    COUNT(*) > 1

  4. #4
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NOM_PERSONNE+' '+PRENOM_PERSONNE
    *
    ERREUR à la ligne 6 :
    ORA-01722: Nombre non valide
    Merci mais je suis doutée de l'erreur qu'il allait me sortir

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 780
    Points
    30 780
    Par défaut
    Et en utilisant l'opérateur normalisé de concaténation || à la place de + ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    A quoi vous sert l'opérateur "+" ?
    S'il s'agit de concaténation, utilisez "||".

    [EDIT]grillé par al1_24
    [/EDIT]
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  7. #7
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Fais ta requête en 2 temps !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT denomination, count(denomination)
    FROM (
    SELECT nom_personne || ' ' || prenom_personne as denomination
    FROM personnes
    )
    GROUP BY denomination
    HAVING COUNT(denomination)>1
    Edit multiples : un peu de mal moi
    Mindiell
    "Souvent, femme barrit" - Elephant man

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Citation Envoyé par BiM
    Je travaille Oracle mais je ne suis pas sûre que ca ait une grande importance.
    si, ça veut dire deux choses :
    - les concaténations se font avec || et non avec +
    - tu n'as pas le droit d'utiliser un alias du SELECT dans ton GROUP BY
    Citation Envoyé par BiM
    Je me pose une question relativement bête : je cherche les doublons dans une table Personne, sur le Nom ET le prénom.
    C'est effectivement tout bête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT NOM_PERSONNE, PRENOM_PERSONNE 
    FROM PERSONNE
    GROUP BY NOM_PERSONNE, PRENOM_PERSONNE 
    HAVING COUNT(*) > 1
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Merci pour la concaténation, je m'en rappelais plus.

    Ensuite en ce qui concerne le GROUP BY Nom_personne, Prenom_personne, comment se fait le having COUNT(*) > 1 ?

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Citation Envoyé par BiM
    Ensuite en ce qui concerne le GROUP BY Nom_personne, Prenom_personne, comment se fait le having COUNT(*) > 1 ?
    COUNT(*) est le nombre de lignes se classant dans les mêmes catégorie (NOM_PERSONNE) et sous-catégories (PRENOM_PERSONNE) définies par le GROUP BY.

    Au passage, tu obtiendrais exactement le même résultat avec COUNT(NOM_PERSONNE) ou COUNT(PRENOM_PERSONNE), tant que ni le nom ni le prénom ne sont pas NULL.

    Si par contre tu utilises COUNT(DISTINCT NOM_PERSONNE) ou COUNT(DISTINCT PRENOM_PERSONNE), tu obtiendras 1 à chaque fois.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  11. #11
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Citation Envoyé par Antoun
    COUNT(*) est le nombre de lignes se classant dans les mêmes catégorie (NOM_PERSONNE) et sous-catégories (PRENOM_PERSONNE) définies par le GROUP BY.

    Au passage, tu obtiendrais exactement le même résultat avec COUNT(NOM_PERSONNE) ou COUNT(PRENOM_PERSONNE), tant que ni le nom ni le prénom ne sont pas NULL.

    Si par contre tu utilises COUNT(DISTINCT NOM_PERSONNE) ou COUNT(DISTINCT PRENOM_PERSONNE), tu obtiendras 1 à chaque fois.
    Merci pour les renseignements supplémentaires, ce n'était pas la peine de te fatiguer autant. J'ai préféré mettre un COUNT(*) (un COUNT(DISTINCT blabla) ne servirait à rien puisque je recherche justement les doublons). Pour l'histoire de grouper par NOM_PERSONNE, PRENOM_PERSONNE, si un jour je constate un mauvais fonctionnement je réouvrirais le sujet.

    En attendant, merci pour vos réponses et bonne journée

  12. #12
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Citation Envoyé par BiM
    Merci pour les renseignements supplémentaires, ce n'était pas la peine de te fatiguer autant. J'ai préféré mettre un COUNT(*) (un COUNT(DISTINCT blabla) ne servirait à rien puisque je recherche justement les doublons).
    absolument à rien ! mais je voulais te donner l'explication complète. Intuitivement, on attend généralement du COUNT simple le comportement du COUNT (DISTINCT).
    Citation Envoyé par BiM
    Pour l'histoire de grouper par NOM_PERSONNE, PRENOM_PERSONNE, si un jour je constate un mauvais fonctionnement je réouvrirais le sujet.
    Le seul cas qui peut poser problème, c'est s'il y a un nom ou un prénom qui est NULL. Certains SGBD regroupent les NULL, d'autres non car NULL n'est pas égal à NULL, et je ne sais pas comment se comporte Oracle.

    Si tu as besoin de bétonner ce cas-là, tu peux remplacer les NULL par une chaîne vide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT NVL(NOM_PERSONNE, ''),
      NVL(PRENOM_PERSONNE, '')
    FROM PERSONNE
    GROUP BY NVL(NOM_PERSONNE, ''),
      NVL(PRENOM_PERSONNE, '')
    HAVING COUNT(*) > 1
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 64
    Points : 75
    Points
    75
    Par défaut Essaye de faire la requète en 2 passages
    En 2 temps , 3 mouvements :

    Création un fichier de travail PERSONNE1

    SELECT NOM_PERSONNE+' '+PRENOM_PERSONNE AS DENOMINATION
    FROM PERSONNE

    puis

    SELECT DENOMINATION
    FROM PERSONNE1
    GROUP BY DENOMINATION
    HAVING COUNT(*) > 1

  14. #14
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Ca implique deux requetes et une table (fichier) temporaire ce qui est hors de question étant donné le cadre (et aussi la taille de la base de données) de l'application. Sinon pour ce qui est des NULL, ce sont des champs obligatoires, donc les NULL, il y a peu de chances, au pire tant pis, j'aurais des NULL :p

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 64
    Points : 75
    Points
    75
    Par défaut Problème de syntaxe sous Oracle
    Au départ c'est bien un problème de syntaxe refusé par Oracle, car, en SQL, j'arrive a coder :

    SELECT CONCAT(NOM , PRENOM) , count(*)
    FROM PERSONNE
    GROUP BY CONCAT(NOM , PRENOM)
    HAVING count(*) > 1

    et j'obtient le bon résultat sur ma table de test

  16. #16
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Fred, ta concaténation ne sert à rien, et en plus elle induit une occasion d'erreur : en effet, MARTIN Aline et MARTINA Line seraient considérées comme un doublon (à l'erreur de casse prêt).
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 64
    Points : 75
    Points
    75
    Par défaut Doublons avec gestion des espaces
    Après vérification de la remarque d'Antoun, je confirme que les espaces sont conservés lors du CONCAT dans mon test :

    'MARTIN' + 'ALINE' est bien différent de 'MARTINA' + 'LINE'

    Tout dépend peut-être de la version de SQL utilisé...

    Ton problème est résolu ?

  18. #18
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut Espaces
    Si ^ représente un espace, dans la mesure où les espaces sont conservés dans la concaténation, 'MARTIN^^^ ' est différent de '^MARTIN^^^ ' , ou encore 'ALINE^^^' est différent de '^ALINE^^^' .

    Donc, 'MARTIN^^^ ' + 'ALINE^^^' est différent de '^MARTIN^^^ ' + 'ALINE^^^' et aussi de 'MARTIN^^^ ' + '^ALINE^^^' ou de '^MARTIN^^^ ' + 'ALINE^^^', etc.

    Cela ne risque-t-il pas poser un problème de doublons malgré tout ?

  19. #19
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Arrêtez vos délires concaténatoires ! j'ai donné la solution il y a dix posts de cela, et c'est complètement basique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT NOM_PERSONNE, PRENOM_PERSONNE 
    FROM PERSONNE 
    GROUP BY NOM_PERSONNE, PRENOM_PERSONNE 
    HAVING COUNT(*) > 1
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  20. #20
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Au moins ca lance un débat, pour le CONCAT il aurait fallu utiliser une concaténation avec un espace en plus.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Recherche de doublons sur trois champs
    Par islande dans le forum PL/SQL
    Réponses: 1
    Dernier message: 22/09/2014, 20h41
  2. Doublons sur deux champs
    Par Steph0 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/01/2011, 23h03
  3. comment chercher les doublons sur deux champs (ou plus)
    Par alili mostafa dans le forum Bases de données
    Réponses: 4
    Dernier message: 31/05/2010, 19h09
  4. Recherche de doublons sur 3 champs
    Par ThE BiShOp* dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/12/2007, 11h20
  5. [Access] supprimer les doublons sur deux champs
    Par nini94 dans le forum Langage SQL
    Réponses: 15
    Dernier message: 13/10/2006, 11h41

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