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 :

Selection de personne ayant le même nom par leur numéro


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Femme Profil pro
    etudiant
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 2
    Points
    2
    Par défaut Selection de personne ayant le même nom par leur numéro
    Bonjour !
    J'ai un problème que je n'arrive pas à résoudre et dont je n'arrive à trouver la solution nul part sur internet.
    J'ai une base de donnée contenant la table :

    EMPLOYE (numE, nom, prenom, dateNaissance)

    Je cherche à selectionner les numE des personnes ayant le même prénom, sans faire de couple doublon.
    Par exemple si j'ai dans ma base de donnée :
    numE nom prenom dateNaissance
    1 ... Test ...
    2 ... Autre ...
    3 ... Test ...
    4 ... Dernier ...
    5 ... Dernier ...


    J'aimerais que le resultat de la requête soit :
    numE numE
    1 3
    4 5

    Et non :
    numE numE
    1 3
    3 1
    4 5
    5 4

    Merci d'avance

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 001
    Points : 2 505
    Points
    2 505
    Par défaut
    Peut-être une piste ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SQL> select * from zztest order by 1;
           NUM NAME
    ---------- ------------------------------
    	 1 DUPOND
    	 2 DUBOIS
    	 3 DUPOND
    	 4 DURAND
    	 5 DURAND
     
    SQL> select listagg(num) from zztest group by NAME having count(*) > 1 order by 1;
    LISTAGG(NUM)
    --------------------------------------------------------------------------------
    13
    45

  3. #3
    Candidat au Club
    Femme Profil pro
    etudiant
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup !
    J'ai tester avec mes variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select listagg(numE) 
    FROM EMPLOYE 
    group by prenom 
    having count(*) > 1 
    order by 1;
    Je ne connais pas l'instruction "listagg" étant grande débutante et j'ai une erreur : "mot-clé WITHIN absent" mais je ne sais pas trop où mettre le WITHIN

    Merci d'avance

  4. #4
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 001
    Points : 2 505
    Points
    2 505
    Par défaut
    C'est bizarre car ton code ressemble au mien et le WITHIN n'est pas obligatoire chez moi (Oracle 19).
    Quelle est ta version d'Oracle?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM v$version;

  5. #5
    Candidat au Club
    Femme Profil pro
    etudiant
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    En tapant la requête version j'ai eu :

    Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 0
    PL/SQL Release 12.1.0.2.0 - Production 0
    "CORE 12.1.0.2.0 Production" 0
    TNS for Linux: Version 12.1.0.2.0 - Production 0
    NLSRTL Version 12.1.0.2.0 - Production 0

    Je l'ai téléchargé depuis le liens que mon université m'a fournit je ne sais pas si c'est la version la plus récente

  6. #6
    Candidat au Club
    Femme Profil pro
    etudiant
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Quand je vais dans à propos j'ai version oracle IDE : 20.4.1.407.0006

  7. #7
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 001
    Points : 2 505
    Points
    2 505
    Par défaut
    Argh, en 19 le WITHIN GROUP est optionnel mais obligatoire en 12c...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SQL> select listagg(num) within group (order by num) from zztest group by NAME having count(*) > 1 order by 1;
     
    LISTAGG(NUM)WITHINGROUP(ORDERBYNUM)
    --------------------------------------------------------------------------------
    13
    45
     
    SQL> select listagg(num) within group (order by name) from zztest group by NAME having count(*) > 1 order by 1;
     
    LISTAGG(NUM)WITHINGROUP(ORDERBYNAME)
    --------------------------------------------------------------------------------
    13
    45

  8. #8
    Candidat au Club
    Femme Profil pro
    etudiant
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Mince, y a-t-il d'autres moyens d'obtenir le même résultat ? J'ai cette question pour un tp mais nous n'avons pas vu la fonction listagg en cours
    Peut-être ai-je mal interpreter la question :
    "Obtenir les employés qui portent le même prénom. On évitera d’afficher deux fois les mêmes paires de employés (a,b) et (b,a). (Indice :2 paires)"
    Cependant, la façon dont ils parlent de "paires (a,b) et (b,a)" me fait penser que a et b représenterais plutôt les numE que les prénom , d'autant que si l'on cherchait les prenoms, on pourrait juste afficher les prénoms en double directement à la place de paires.
    Mais je ne vois pas trop comment faire

  9. #9
    Candidat au Club
    Femme Profil pro
    etudiant
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Ah je n'avais pas vu le code je vais l'essayer

    Après test, cela me renvoit les bons numéro mais sur une seule colonne et collé : 112 au lieu de 1 et 12

  10. #10
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 001
    Points : 2 505
    Points
    2 505
    Par défaut
    Ah oui, listagg concatène le résultat en une colonne et une seule.
    Désolé, je ne vois rien d'autre.

  11. #11
    Candidat au Club
    Femme Profil pro
    etudiant
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    D'accord, je vais select les prénoms au lieu des numE alors.
    Merci beaucoup de votre aide

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 285
    Points : 12 987
    Points
    12 987
    Par défaut
    Bonjour,
    Une petite solution, peut-être pas la plus performante, mais qui devrait fonctionner:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select T1.id,T2.id
    from LaTable as t1
    inner join LaTable as t2 on t1.nom = t2.nom and t1.id < t2.id
    left outer join LaTable as t3 on t3.nom = t1.nom and t3.id between t1.id and t2.id
    where t3.id is null

    Il n'y aura pas de doublon dans le résultat, par contre s'il existe 3 lignes avec le même nom la requête sortira 2 "couples": 1/2 et 2/3. Le "couple" 1/3 ne sera pas renvoyé, pas plus que les couples 2/1, 3/2 ou 3/1.

    Tatayo.

  13. #13
    Candidat au Club
    Femme Profil pro
    etudiant
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    D'accord, merci beaucoup pour votre aide !

  14. #14
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 161
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,
    Je suppose qu'il ne peut n'y avoir que des doublons de prénoms sur 2 employés max. Dans ce cas voici un exemple de requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select min(nume) nume_1, max(nume) nume_2
    from employe e1
    where exists (select 1 from employe e2
                  where e2.prenom = e1.prenom
                    and e2.nume != e1.nume
                 )        
    group by prenom;

  15. #15
    Candidat au Club
    Femme Profil pro
    etudiant
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup ! Je pense qu'il faut que cela puisse fonctionner même avec plus de 2 employés de même prénom. Merci quand même pour votre aide ! je vais donc cloturer le sujet

  16. #16
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 161
    Points : 1 956
    Points
    1 956
    Par défaut
    S'il faut que cela fonctionne pour plus de 3 employés, le résultat est alors mal présenté.
    Supposons que les employés 1, 2 et 3 ont le même prénoms. Alors quelles paires faut-il présenter?

    (1, 2)
    (1, 3)
    (2, 3)

    De plus, comment dans ce cas on devine que (1, 2), (1, 3) ou (2, 3) ont en fait le même prénom?

  17. #17
    Candidat au Club
    Femme Profil pro
    etudiant
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    En fait, la question de mon sujet de tp est "Obtenir les employés qui portent le même prénom. On évitera d’afficher deux fois les mêmes paires de employés (a,b) et (b,a).", sans plus de précision, j'imaginais qu'il fallait que ça marche dans le cas le plus général, donc qui puisse fonctionner si plus de deux personnes ont le même prénoms.
    Après deviner que ces 3 personnes ont le même prénoms me parait logique, si 1 et 3 ont le même prénom et que 3 et 2 ont le même prénom, comprendre que 1 et 2 ont le même prénom est instinctif, si a = b et b = c on voit que a = c.
    Je pense que l'affichage des paires pourrait être n'importe lequelle tant que les couples y sont.
    On pourrait donc ici avoir :
    (1, 2)
    (1, 3)
    (2, 3)
    Ou bien :
    (2,1)
    (3,1)
    (3,2)
    ou autres, cela ne pose pas de problème, en revanche je ne sais faire la requête pour aucunes des solutions .

    Après, ceci étant l'une de mes premières UE d'sql, je ne pense pas avoir les connaissance nécessaire pour résoudre cette question, notamment au vu des solutions proposée ici qui utilise des choses que je n'ai pas vu en cours (je pense de ce fait que les enseignant ne s'attendent pas à ce qu'on les utilise).
    J'en conclu donc que je l'ai mal interpreté et que, même si précisé nul part, on part effectivement du principe qu'il ne peut y avoir que deux personnes au même prénom, cependant je connais pas les min() , max() et exists et nous ne les avons pas encore vu je ne peux donc pas les utiliser.
    J'avais comme idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Select DISTINCT e1.numE, e2.numE
    FROM EMPLOYE e1, EMPLOYE e2
    WHERE e1.PRENOM = e2.PRENOM and e1.NumE != e2.NumE;
    Mais cela me renvoit tous les couples en double par exemple :
    1,3
    3,1
    au lieu de seulement (1,3) ou seulement (3,1)
    Je ne sais pas si c'est réaliste sans utiliser ces fonctions, nous avons vu les group by et having mais j'avoue ne pas trop voir comment faire

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 285
    Points : 12 987
    Points
    12 987
    Par défaut
    Puisqu'il s'agit d'un exercice, je ne vais pas te donner la solution, mais une piste.

    En fait tu n'as qu'une petite modification à faire dans ta requête pour avoir le résultat demandé.
    Ta requête renvoie:
    (1, 2)
    (1, 3)
    (2, 3)
    Et:
    (2,1)
    (3,1)
    (3,2)
    Or tu ne veux que la première liste. Qu'est-ce qui est commun respectivement aux trois lignes de la première liste, à celles de la deuxième liste, mais qui fait toute la différence entre ces deux listes ?
    De là ta devrais rapidement trouver ce qu'il faut modifier dans ta requête.

    Tatayo.

  19. #19
    Candidat au Club
    Femme Profil pro
    etudiant
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    Je sais que vous voulez bien faire en ne me donnant pas la solution pour que j'y réfléchisse car c'est un exercice, en revanche, si je posais la question ici c'etait en dernier recours après avoir cherché pendant des heures une solution, j'ai trituré autant que j'ai pu ma requête trouvée, en vain. Je ne pose pas la question ici par flemme , j'y ai réfléchi, cependant réfléchir à un exercice c'est bien, mais avoir une solution à pouvoir comprendre après des recherche et apprendre des choses de ce temps passé, c'est mieux .
    J'aimerais vraiment une solution, car je suis plus que perdue, je ne vois absolument pas où vous voulez en venir, je ne vois pas ce qu'ils ont en commun sachant que toutes les solutions qui m'ont été données ici utilisaient des choses que je ne peux utiliser car pas vu en cour (donc ce n'est, je pense, pas ce qu'ils attendent) , tels que "join", "inner join" , "exist", "left", "outer" ...
    D'autre part je ne pense pas que nos enseignant nous donneront les corrections après les rendu et j'aimerais notamment avoir une solution pour savoir y répondre si un jour je recroise cette question/situation.
    Merci d'avance

  20. #20
    Candidat au Club
    Femme Profil pro
    etudiant
    Inscrit en
    Janvier 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Janvier 2020
    Messages : 13
    Points : 2
    Points
    2
    Par défaut
    Peut-être la différence est que la première liste a toujours le plus petit numéro en premier et la deuxième liste à toujours le plus grand nombre en premier ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/12/2011, 01h46
  2. Stocker des tables ayant le même nom
    Par caroleo63 dans le forum Alimentation
    Réponses: 5
    Dernier message: 20/06/2008, 22h15
  3. Charger 2 dlls ayant le même nom
    Par kurtisnotdead dans le forum Framework .NET
    Réponses: 4
    Dernier message: 14/05/2008, 14h40
  4. Controller CheckBoxes ayant le même nom.
    Par JFKen dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/08/2006, 11h19
  5. Obtenir les enregistrements ayant le même nom et prénom
    Par llc123 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/07/2006, 16h47

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