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 :

Requête recherche de doublon


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Chargé d'application
    Inscrit en
    Juillet 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Chargé d'application

    Informations forums :
    Inscription : Juillet 2018
    Messages : 3
    Par défaut Requête recherche de doublon
    Bonjour,

    Je demande humblement votre aide pour trouver une solution à mon problème de requête SQL ^^'. Je précise que je débute en Oracle SQL donc pardonnez ma faiblesse si le problème à l'air simple.

    Mon boulot consiste à trouver des utilisateurs répondant à différents critères dans un table. Un exemple de la table en question ci-dessous (schématique l'exemple, je peux pas être précis désolé).
    Le tableau dans lequel je fais mes recherches :
    ID nom prénom NumEmployé NumService

    Je bloque sur un des critères de ma liste, je n'arrive pas à pondre une requête répondant à mes besoins. Je dois trouver un utilisateur répondant au critères suivants :
    • L'utilisateur a deux ID différents (ID1 et ID2)
    • Pour le premier ID, l'utilisateur est connu dans un service avec un numéro employé (NumEmployé 1 et NumService 1)
    • Pour le second ID, l'utilisateur est connu dans deux services différents (NumService 2 et 3) avec un numéro employé différents pour chaque service (NumEmployé 2 et 3)


    En résumé sous forme de tableau :
    ID n°1 Nom identique Prénom identique NumEmployé n°1 NumService n°1
    ID n°2 Nom identique Prénom identique NumEmployé n°2 NumService n°2
    ID n°2 Nom identique Prénom identique NumEmployé n°3 NumService n°3

    Quand je dois chercher un doublon sur ID, ça va c'est simple. Si je dois chercher un utilisateur connu dans deux services également, mais cette combinaison bien précise, là je bloque.

    Ensuite je dois faire différente variante de cette requête, un exemple :
    ID n°1 Nom identique Prénom identique NumEmployé n°1 NumService n°1
    ID n°1 Nom identique Prénom identique NumEmployé n°2 NumService n°2
    ID n°2 Nom identique Prénom identique NumEmployé n°1 NumService n°1
    ID n°2 Nom identique Prénom identique NumEmployé n°3 NumService n°1

    Je dois pas appliquer la bonne logique et je m'énerve ><. Faut il faire un intersect ?

    J'espère que je suis clair. Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Désolé, c'est pas très clair.

    Fournissez un exemple plus concret et également le ou les résultat(s) attendu(s).

  3. #3
    Candidat au Club
    Homme Profil pro
    Chargé d'application
    Inscrit en
    Juillet 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Chargé d'application

    Informations forums :
    Inscription : Juillet 2018
    Messages : 3
    Par défaut
    Désolé je vais essayer de faire plus clair :

    Donc ma table suivante :
    ID Nom Prénom NumEmployé NumService
    01 Jean Paul 01 A
    02 Claire Marie 21 A
    03 Jean Paul 03 B
    04 Marc Anne 52 G
    03 Jean Paul 12 F
    08 Pas D'idée 47 D
    04 Marc Anne 09 D

    Je souhaite avoir une requête pour connaitre un employé :
    • Ayant deux ID différents (ID 1 et ID 2)
    • Pour l'ID 1, on un un NumEmployé et un NumService (NumEmployé 1 et NumService 1)
    • Pour l'ID 2, on connait 2 NumEmployé différents et 2 NumService différents (NumEmployé 2 et 3+NumService 2 et 3)


    Dans mon tableau ci-dessus, le résultat attendu c'est Jean Paul :

    ID Nom Prénom NumEmployé NumService
    01 Jean Paul 01 A
    03 Jean Paul 03 B
    03 Jean Paul 12 F

    J'aurais dû commencé par là, j'espère que ça ira.

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Je donne une requête qui répond à ce besoin spécifique, mais il faut voir les autres cas (exemple si l'employé à un 3ème id, etc..)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH T AS (SELECT '01' ID, 'Jean' nom, 'Paul' prenom, '01' numEmploye, 'A' numService FROM DUAL
    UNION ALL SELECT '02' ID, 'Claire', 'Marie', '21', 'A' FROM DUAL
    UNION ALL SELECT '03' ID, 'Jean', 'Paul', '03', 'B' FROM DUAL
    UNION ALL SELECT '04' ID, 'Marc', 'Anne', '52', 'G' FROM DUAL
    UNION ALL SELECT '03' ID, 'Jean', 'Paul', '12', 'F' FROM DUAL
    UNION ALL SELECT '08' ID, 'Pas', 'Didée', '47', 'D' FROM DUAL
    UNION ALL SELECT '04' ID, 'Marc', 'Anne', '09', 'D' FROM DUAL)
    SELECT *
    FROM T
    WHERE (nom, prenom) IN (SELECT nom, prenom FROM T GROUP BY ID, nom, prenom HAVING COUNT(*) = 2 AND MIN(numEmploye ||'.'|| numService) <> MAX(numEmploye ||'.'|| numService)
    INTERSECT
    SELECT MIN(nom), MIN(prenom) FROM T GROUP BY ID HAVING COUNT(*) = 1

  5. #5
    Candidat au Club
    Homme Profil pro
    Chargé d'application
    Inscrit en
    Juillet 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Chargé d'application

    Informations forums :
    Inscription : Juillet 2018
    Messages : 3
    Par défaut
    Merci je vais regarder ça.
    Il peut y avoir d'autres cas effectivement. Il n'aura jamais un 3ème ID mais par exemple pour le 1er ID il peut également être connu sur deux services et non 1 seul, et on peut avoir des num employé identique d'un service à l'autre, ...
    Toujours Jean Paul en exemple de résultat attendu sur le même genre de table :

    ID Nom Prénom NumEmployé NumService
    01 Jean Paul 12 A
    01 Jean Paul 03 B
    03 Jean Paul 03 B
    03 Jean Paul 12 F

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    POC pour faire avancer la discussion :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    create table data_source (
      id number(19,0),
      nom varchar2(64),
      prenom varchar2(64),
      num_employe varchar2(64),
      num_service varchar2(64)
    );
     
    insert into data_source(id, nom, prenom, num_employe, num_service)
    values(1, 'DUPONT', 'Jean', 'ne1', 'ns1') ;
    insert into data_source(id, nom, prenom, num_employe, num_service)
    values(2, 'DUPONT', 'Jean', 'ne2', 'ns2') ;
    insert into data_source(id, nom, prenom, num_employe, num_service)
    values(2, 'DUPONT', 'Jean', 'ne3', 'ns3') ;
     
    insert into data_source(id, nom, prenom, num_employe, num_service)
    values(3, 'MARTIN', 'Jacques', 'ne4', 'ns1') ;
    insert into data_source(id, nom, prenom, num_employe, num_service)
    values(4, 'MARTIN', 'Jacques', 'ne4', 'ns2') ;
    insert into data_source(id, nom, prenom, num_employe, num_service)
    values(4, 'MARTIN', 'Jacques', 'ne4', 'ns3') ;
     
    insert into data_source(id, nom, prenom, num_employe, num_service)
    values(5, 'DURAND', 'Paul', 'ne5', 'ns1') ;
    insert into data_source(id, nom, prenom, num_employe, num_service)
    values(6, 'DURAND', 'Paul', 'ne6', 'ns2') ;
    insert into data_source(id, nom, prenom, num_employe, num_service)
    values(6, 'DURAND', 'Paul', 'ne7', 'ns2') ;
     
    insert into data_source(id, nom, prenom, num_employe, num_service)
    values(7, 'GASPARD', 'Pierre', 'ne8', 'ns1') ;
    insert into data_source(id, nom, prenom, num_employe, num_service)
    values(9, 'GASPARD', 'Pierre', 'ne10', 'ns2') ;
    insert into data_source(id, nom, prenom, num_employe, num_service)
    values(8, 'GASPARD', 'Pierre', 'ne9', 'ns2') ;
    insert into data_source(id, nom, prenom, num_employe, num_service)
    values(9, 'GASPARD', 'Pierre', 'ne11', 'ns3') ;
     
     
    with a_2_ids as (
    select nom, prenom from data_source
      group by nom, prenom having(count(distinct id) = 2) 
    )
    select distinct d1.nom, d1.prenom from data_source d1
      where (d1.nom, d1.prenom) in (select * from a_2_ids)
      and exists(
          select d2.id from data_source d2
            where d1.nom = d2.nom and d1.prenom = d2.prenom
            group by d2.id having (count(distinct num_employe) > 1)
      )
      and exists(
          select d2.id from data_source d2
            where d1.nom = d2.nom and d1.prenom = d2.prenom
            group by d2.id having (count(distinct num_service) > 1)
      )
    ;
    NOM PRENOM
    DUPONT Jean

    Maintenant si la condition sur le premier ID est d'être dans un SEUL service, ajoutez la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      and exists(
           select d2.id from data_source d2 
            where d1.nom = d2.nom and d1.prenom = d2.prenom
              group by d2.id having (count(distinct num_service) = 1)
      )

Discussions similaires

  1. Requête SQL avec doublon
    Par pierrot53 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/10/2009, 21h48
  2. requête sql probleme doublons
    Par Invité dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/04/2008, 14h02
  3. [Requête]Eviter les doublons
    Par atlantideD dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 19/04/2007, 12h28
  4. Requête ajout sans doublons
    Par oceanediana dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 02/08/2006, 11h20
  5. Requête : enlever les doublons
    Par Metallic-84s dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/03/2006, 20h34

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