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 :

Problème de jointure gauche sur requête complexe


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Par défaut Problème de jointure gauche sur requête complexe
    Bonjour à tous, je débute en Oracle et j'espère poster au bon endroit.
    Je dois exécuter une requête pour faire ressortir tous les usagers d'une structure avec leur nom, prénom, adresse, ville, tel, âge, maladie, date de début de séjour, nom d'une personne référente et d'un intervenant.
    Voici la requête que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT usg_nom "Nom",usg_prenom "Prénom",usg_adr_rue1 "Adresse",usg_adr_rue2 "Adresse suite",usg_adr_cp "Code postal",usg_adr_ville "Ville",usg_tel_principal 
    "Téléphone principal",usg_tel_port "Téléphone portable",trunc(((sysdate-usg_datenais)/365.25),0)||'ans' "Age",etiologie "Pathologie",sjr_datedeb "Date de début",prj_referent "Référent",itv_nom|| ' ' ||itv_prenom "Intervenant"
    FROM usager,projet,fiche_handicap,intervenant,etio,sejour
    WHERE usg_inactif=0 
    AND fh_usg_id=usg_id
    AND prj_itv_id=itv_id
    AND usg_id=prj_usg_id
    AND code=fh_codeapf
    AND usg_id=sjr_usager_id (+)
    Seulement, cette requête ne renvoi que les usagers ayant un intervenant, et je voudrais aussi faire apparaître ceux n'en ayant pas et donc faire une jointure gauche sur les tables projet et usager soit afin que la requête me donne les usagers dont le champ intervenant est NULL mais je ne sais pas comment faire.

    Et j'ai le même problème sur ma deuxième requête un peu équivalente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT usg_nom "Nom",usg_prenom "Prénom",usg_datenais "Date de naissance",etiologie "Pathologie",prj_referent "Référent",sjr_datenvdos 
    "Depôt du dossier",usg_ass_cpam1_droits "Validité droits SS",sjr_datedeb "Debut des notifications",sjr_datefin "Fin des notifications"
    FROM usager, sejour,projet,etio,fiche_handicap
    WHERE usg_inactif=0
    AND fh_usg_id=usg_id
    AND usg_id=prj_usg_id
    AND code=fh_codeapf
    AND usg_id=sjr_usager_id (+)
    qui me donne les mêmes résultats que la première alors que n'apparaît aucune mention des intervenants dans cette requête.

    Quelqu'un aurait-il une idée, une piste à explorer pour m'aider à avancer ?
    Merci beaucoup

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Sans savoir quelle colonne appartient à quelle table, c'est très difficile de vous aider.

    Aliasez vos tables et utilisez ces alias pour toutes les colonnes.

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Par défaut
    Un des pièges classique des jointures externes et l'ajout de conditions ds le WHERE qui invalide des données a null voulu justement par la jointure externe.
    Un exemple:
    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
    WITH Ecole AS
    (
    SELECT 1 AS ecole_pk,'Dorgeles' AS nomEcole FROM dual union ALL
    SELECT 2 , 'Barbusse' FROM dual union ALL
    SELECT 3 , 'Zweig' FROM dual 
    ),
    Enfant AS
    (
    SELECT 1 AS enfant_pk,'Yves' AS prenom , 'K' as nom, 1 as ecole_fk FROM dual union ALL
    SELECT 2 ,'Paul','D',1 FROM dual union ALL
    SELECT 3 ,'Tony','C',2 FROM dual 
    ),
    adresse AS
    (
    SELECT 1 AS adresse_pk,'TRUCVILLE' AS ville, 1 as enfant_fk FROM dual 
    )
    select
    en.enfant_pk,
    en.prenom,
    en.nom,
    ad.ville
    from Enfant en
           LEFT OUTER JOIN Ecole ec ON en.ecole_fk=ec.ecole_pk
           LEFT JOIN adresse ad on en.enfant_pk=ad.enfant_fk
    WHERE ville is not null
    Pour plus d'info, comme Waldar vous le demande, il faut ajouter des détails.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Par défaut
    Merci, je précise :
    - les champs commençant par usg appartiennent à la table usager,
    - les champs commençant par sjr appartiennent à la table séjour,
    - les champs commençant par pjr appartiennent à la table projet,
    - les champs commençant par itv appartienennt à la table intervenant,
    - le champ etiologie appartient à la table etio
    - le champ code appartient à la table etio
    - le champ fh_code_apf appartient à la table fiche handicap

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Le mieux serait de l'implémenter dans la requête, pour lever toutes les ambiguités.
    Cela se fait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     FROM usager usg, projet prj
    WHERE usg.usg_inactif = 0
      AND usg.usg_id = prj.prj_usg_id

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 3
    Par défaut
    Je vous remercie de votre aide, avec de l'aide j'ai réussi à trouver la bonne requête, il manquait une jointure gauche qu'on met en place en plaçant (+) avant le = dans la jointure de 2 tables.
    Et mes conditions étaient bien dans le WHERE

Discussions similaires

  1. Problème de jointure gauche
    Par david71 dans le forum SQL
    Réponses: 1
    Dernier message: 29/07/2010, 21h12
  2. problème de jointure entre deux requêtes séparées
    Par sinifer dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/05/2009, 15h24
  3. Problème de doublons dans une requète complexe
    Par noakiss dans le forum Langage SQL
    Réponses: 7
    Dernier message: 20/03/2008, 09h19
  4. [MySQL] Jointure externe sur requête avec MySQL
    Par ginkas31 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 01/02/2008, 11h02
  5. Problème de jointure gauche
    Par titecaro dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/04/2007, 16h18

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