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 :

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


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 14
    Points : 19
    Points
    19
    Par défaut 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é
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Bonjour,
    Il serait plus simple de passer par une table pivot, il me semble.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 129
    Points : 38 516
    Points
    38 516
    Billets dans le blog
    9
    Par défaut
    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é
    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
    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
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 14
    Points : 19
    Points
    19
    Par défaut
    Merci à tous pour vos réponses cela m'a beaucoup aidé

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/10/2008, 18h08
  2. Réponses: 2
    Dernier message: 02/04/2008, 09h59
  3. Check avec une sous-requête
    Par Neal Morse dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 22/03/2008, 22h31
  4. Ordonner avec une sous requête ,possible ou pas?
    Par worm1 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/02/2007, 06h23
  5. Update avec une sous requête
    Par Deejoh dans le forum Installation
    Réponses: 7
    Dernier message: 25/01/2006, 11h50

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