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 :

Résoudre avec une sous requête [Gros blocage ]


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Résoudre avec une sous requête [Gros blocage ]
    Bonjour ça fait maintenant 2 heures que je bloque sur une question qui à l'air simple au premier abord mais rien à faire je bloque :

    J'ai deux tables employé et service (avec noserv qui lie les deux tables) et la ville se trouvant dans la table serv

    et je dois répondre à la question suivante :

    Sélectionner les noms, le numéro de service, l’emplois et le salaires des
    personnes travaillant dans la même ville que 'HAVET' (havet étant un nom appartenant à la table employé).


    J'ai aucune idée de comment résoudre cette question j 'ai codé ceci mais la solution n'est pas bonne car si 'HAVET' change de ville alors je ne peux plus le suivre.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select nom, noserv
    from emp
    where noserv in( select noserv
    from serv
    where ville = 'LILLE');



    Celui qui me débloquera aura ma reconnaissance éternelle...

  2. #2
    Membre éprouvé
    Bonjour,
    Il serait plus simple de passer par une table pivot, il me semble.

  3. #3
    Expert éminent sénior
    Bonjour,

    C'est normal que vous ayez des difficultés car les tables sont très mal construites.
    En effet, avec deux tables seulement, un employé occupe le même service et le même emploi toute sa vie et un service ne peut jamais changer de ville !
    Très peu conforme à la réalité.
    De plus, rechercher sur un nom est hasardeux : si plusieurs employés s'appellent "HAVET" il est impossible de distinguer celui qui vous intéresse

    Compte tenu de ce modèle de données bien moisi, voici une solution possible parmi tant d'autres

    employé
    (EM_id, EM_nom, EM_prenom, EM_salaire, EM_emploi, SV_id#...)
    service
    (SV_id, SV_libelle, SV_ville)

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select EM_id
         , EM_nom
         , EM_prenom
         , EM_salaire
         , EM_emploi
    from employe T1  
    where T1.SV_ville =
         (select max(SV_ville)    
          from service T2
          inner join employe T3
             on T3.sv_id=T2.sv_id
          where upper(T3.EM_nom)='HAVET'
         )

    Le max()sert ici à garantir l'unicité du résultat de la requête corrélée, au cas où plusieurs personnes s'appelleraient "HAVET" mais travailleraient dans des villes différentes
    Le uppersert à s'affranchir des erreurs liées aux noms en majuscules ou minuscules

  4. #4
    Membre chevronné
    Si l'on veut prendre en compte d'éventuels doublons, la clause EXISTS peut être utile

    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
    select EM_id
         , EM_nom
         , EM_prenom
         , EM_salaire
         , EM_emploi
    from employe E1
      inner join service S1
        on E1.sv_id=S1.sv_id
    where EXISTS
         (select NULL
          from service S2
            inner join employe E2
              on S2.sv_id=E2.sv_id
          where S1.SV_ville =S2.SV_ville
          and upper(E2.EM_nom)='HAVET'
         )


    PS : La ville étant dans la table "Service", il faut une jointure avec dans la requête principale pour pouvoir joindre la sous-requête

  5. #5
    Membre à l'essai
    Merci à tous pour vos réponses cela m'a beaucoup aidé

###raw>template_hook.ano_emploi###