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

Langage SQL Discussion :

Right Outer Join


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Par défaut Right Outer Join
    Salut à tous, j'ai 2 tables :

    COBATY MONTPELLIER


    NOM
    PRENOM


    LIEN_CONJOINTS

    ID_ADHERENT
    ID_CONJOINT

    La table adhérent regroupe à la fois les adhérents et les conjoint, on se sert de la table LIEN_CONJOINTS pour voir qui est le conjoint de quel adhérent.

    Je voudrai executer qui récupère les infos des membres et des conjoints pour les membres ayant un conjoint ou n'en ayant pas.

    Pour l'instant j'ai cette requête qui mepermet bien de récupérer les infos des membres et conjoints pour les membres ayant un conjoint :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [COBATY MONTPELLIER].*, [COBATY MONTPELLIER_1].*
    FROM [COBATY MONTPELLIER], [COBATY MONTPELLIER] AS [COBATY MONTPELLIER_1], LIEN_CONJOINTS
    WHERE ((LIEN_CONJOINTS.ID_ADHERENT = [COBATY MONTPELLIER].N°)
    AND (LIEN_CONJOINTS.ID_CONJOINT = [COBATY MONTPELLIER_1].N°));
    Seulement cette requête ne me récupère pas les infos des membres n'ayant pas de conjoint. On m'a dit d'utiliser RIGHT OUTER JOIN, j'ai donc essayé de faire la reqûete suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT [COBATY MONTPELLIER].*, [COBATY MONTPELLIER_1].*
    FROM [COBATY MONTPELLIER]
    INNER JOIN  LIEN_CONJOINTS
         ON  [COBATY MONTPELLIER].N° = LIEN_CONJOINTS.ID_ADHERENT 
    RIGHT OUTER JOIN  [COBATY MONTPELLIER] AS [COBATY MONTPELLIER_1] 
         ON  [COBATY MONTPELLIER_1].N°= LIEN_CONJOINTS.ID_CONJOINT;
    malheureusement cette requête ne fonctionne pas on me dit que la syntaxe n'est pas correcte et qu'il manque un opérateur.

    Qu'elqu'un a-t-il une idée ?

    ps: je suis sous access.

  2. #2
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Bonsoir,

    C'est quoi le message qui te dit que ça ne va pas ?

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Par défaut
    Citation Envoyé par lodan
    Bonsoir,

    C'est quoi le message qui te dit que ça ne va pas ?
    Citation Envoyé par RodEpsi
    malheureusement cette requête ne fonctionne pas on me dit que la syntaxe n'est pas correcte et qu'il manque un opérateur.
    L'erreur exacte :

    "Erreur de syntaxe (opérateur absent) dans l'expression "[COBATY MONTPELLIER].N° = LIEN CONJOINTS.ID_ADHERENT RIGHT OUTER JOIN [COBATY MONTPELLIER] AS [COBATY MONTPELLIER_1]
    ON [COBATY MONTPELLIER_1].N°= LIEN_CONJOINTS.ID_CONJOINT".

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Par défaut
    A mon avis le problème est qu'il manque un séparateur entre le INNER JOIN et le RIGHT OUTER JOIN j'avais testé avec l'opérateur AND mais sans succès en fait je pense qu'il y a un jeu de parenthèses à trouver mais je suis pas très à l'aise avec ce genre de requête...

    Si quelqu'un peut m'aider, merci.

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Par défaut
    j'ai ajouté des parenthèses comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT [COBATY MONTPELLIER].*, [COBATY MONTPELLIER_1].*
    FROM (([COBATY MONTPELLIER]
    INNER JOIN  LIEN_CONJOINTS
    ON  [COBATY MONTPELLIER].N° = LIEN_CONJOINTS.ID_ADHERENT) RIGHT OUTER JOIN  [COBATY MONTPELLIER] AS [COBATY MONTPELLIER_1] 
                                                                       ON  [COBATY MONTPELLIER_1].N°= LIEN_CONJOINTS.ID_CONJOINT) ;
    Ceci semble avoir résolu le problème de l'opérateur absent seulement Access me renvoit à présent l'erreur suivante :

    "Expression de jointure non supportée"

    y'a-t-il un problème avec Access ? Ne sait-il pas gérer la composition d'une expression INNER JOIN et RIGHT OUTER JOIN ???

    Qu'elqu'un a-t-il une réponse ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Par défaut
    Citation Envoyé par RodEpsi
    y'a-t-il un problème avec Access ? Ne sait-il pas gérer la composition d'une expression INNER JOIN et RIGHT OUTER JOIN ???
    si si, il sait. Au début j'étais allergique aux jointures LEFT and co car Access mets énormément de parenthèse qui rendent illisibles le code. Je suppose que cette multitude de parenthèse sert à pouvoir transformer une expression SQL en requête visuelle (QBE).

    Donc même si ta jointure est correct dans un SGBDR "normal", il faut concevoir ton expression SQL pour que ça soit compatible QBE.

    J'ai triché en passant par le QBE et j'obtiens cela, pour voir d'où le problème venait, parce que effectivement il y a un souci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT [COBATY MONTPELLIER].*, [COBATY MONTPELLIER_1].*
    FROM ([COBATY MONTPELLIER] INNER JOIN LIEN_CONJOINTS 
    ON [COBATY MONTPELLIER].[] = LIEN_CONJOINTS.ID_ADHERENT) 
    RIGHT JOIN [COBATY MONTPELLIER] AS [COBATY MONTPELLIER_1] 
    ON LIEN_CONJOINTS.ID_CONJOINT = [COBATY MONTPELLIER_1].[];
    Il faut noter qu'il a entouré de crochet N°. Il faut dans tout les SBDR éviter les caractères spécifiques et les espaces, certains le permettent mais il faut mettre un crochet.
    D'autre part on dirait qu'il a mis entre parenthèse de la première table jusqu'à la fin de la première jointure. Mais j'ai surtout l'erreur suivante:
    L'instruction SQL n'a pas pu être exécutée parce qu'elle contient des jointures externes ambiguës. Pour forcer l'ordre d'exécution d'une des jointures en premier, créez une requête distincte qui exécute la première jointure, puis insérez cette requête dans votre instruction SQL. (Erreur 3258)
    Mouais ce message prouve que Access est plus limité que d'autres SBGDR dans la syntaxe des jointures.
    Visiblement toute la jointure LEFT doit être suivi de jointure dans le même sens (et inversemment en RIGHT) et une jointure INNER en premier ne peut être suivi que d'une jointure INNER ou LEFT (et inversement INNER en dernier précédée d'une jointure RIGHT.
    La requête suivante fonctionne en remplacant le INNER par un RIGHT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT [COBATY MONTPELLIER].*, [COBATY MONTPELLIER_1].*
    FROM ([COBATY MONTPELLIER] RIGHT JOIN LIEN_CONJOINTS 
    ON [COBATY MONTPELLIER].[N°] = LIEN_CONJOINTS.ID_ADHERENT) 
    RIGHT JOIN [COBATY MONTPELLIER] AS [COBATY MONTPELLIER_1] 
    ON LIEN_CONJOINTS.ID_CONJOINT = [COBATY MONTPELLIER_1].[N°];
    Tu peux essayer de contourner le problème en rajoutant WHERE ((([COBATY MONTPELLIER].[N°]) Is Not Null)) pour simuler une jointure INNER.

    edit, précision sur le SQL standard: Ta requête initiale est parfaitement correcte en SQL standard. Pas besoin de parenthèses et les requêtes très complexes sont acceptées.

Discussions similaires

  1. fonctionnement du RIGHT OUTER JOIN hibernate
    Par Pinkwyzard dans le forum Hibernate
    Réponses: 0
    Dernier message: 26/05/2009, 13h20
  2. [SQL2K5][MDX] Left ou Right Outer Join en MDX
    Par Jinroh77 dans le forum SSAS
    Réponses: 8
    Dernier message: 27/08/2008, 10h49
  3. Microsoft Access - Left/Right Outer Join
    Par Erakis dans le forum Langage SQL
    Réponses: 10
    Dernier message: 22/04/2008, 18h17
  4. [migration] right outer join (+) vers SQL Standard
    Par Kahiros dans le forum Oracle
    Réponses: 7
    Dernier message: 02/01/2006, 10h41

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