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

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 54
    Points
    54
    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 extrêmement actif 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
    Points : 682
    Points
    682
    Par défaut
    Bonsoir,

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

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 54
    Points
    54
    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 du Club
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 54
    Points
    54
    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 du Club
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 54
    Points
    54
    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 éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    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.

  7. #7
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 54
    Points
    54
    Par défaut
    D'abord merci phili_b pour ton aide.

    Ensuite g testé la requête avec la clause WHERE que tu m'as di d'ajouter, c'est-à-dire :

    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] 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°]
    WHERE ((([COBATY MONTPELLIER].[N°]) Is Not Null));
    Cette requête fonctionne mais ne me renvoit malheureusement que les infos des adhérents et de leur conjoint respectif pour les adhérent ayant un conjoint. Les adhérents n'ayant pas de conjoint ne sont pas retenus, donc j'en reviens à mon problème initial

    Je me susi dis que je pourrais peut être essayer avec une clause UNION en faisant la requête récupérant les adhérents et leur conjoint respectif pour les adhérents ayant un conjoint puis la requête récupérant les adhérents n'ayant pas de conjoint.

    J'ai donc la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    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°));
    UNION
    SELECT [COBATY MONTPELLIER].*, [COBATY MONTPELLIER_1].*
    FROM [COBATY MONTPELLIER], [COBATY MONTPELLIER] AS [COBATY MONTPELLIER_1] 
    WHERE  [COBATY MONTPELLIER].N° not in (select ID_ADHERENT from LIEN_CONJOINTS);
    Cette requête semble pouvoir marcher cependent il demeurre un petit problème qui est que dans ma table "Cobaty Montpellier" g un champ 'photo2' de type OLE Object et l'Union ne semble pas gérer les objets OLE puisque j'obtiens l'erreur suivante :

    "Impossible d'utiliser un champ de type Memo, Ole ou Hyperlink object 'photo2' dans la clause Select d'une requête Union"

    Je sais plus quoi faire j'ai absolument besoin de récupérer ces résultats ...

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

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Sinon, comme le dit le message d'erreur que j'ai cité, la solution sous Access est le plus souvent de faire une requête distincte de la première qui sera ensuite appelée par la première.

    Correspond aux sous-requêtes en SQL standard.

    Voici une solution (j'ai recrée les tables sur Access mais sans données).

    Requête Conjoint_adh_montp
    SELECT [COBATY MONTPELLIER].*,LIEN_CONJOINTS.*
    FROM [COBATY MONTPELLIER]
    INNER JOIN LIEN_CONJOINTS
    ON [COBATY MONTPELLIER].[N°] = LIEN_CONJOINTS.ID_ADHERENT;
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Conjoint_adh_montp.*, [COBATY MONTPELLIER].*
    FROM Conjoint_adh_montp
    RIGHT JOIN [COBATY MONTPELLIER] 
    ON Conjoint_adh_montp.ID_CONJOINT = [COBATY MONTPELLIER].[N°];

  9. #9
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par phili_b
    Sinon, comme le dit le message d'erreur que j'ai cité, la solution sous Access est le plus souvent de faire une requête distincte de la première qui sera ensuite appelée par la première.

    Correspond aux sous-requêtes en SQL standard.

    Voici une solution (j'ai recrée les tables sur Access mais sans données).

    Requête Conjoint_adh_montp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [COBATY MONTPELLIER].*,LIEN_CONJOINTS.*
    FROM [COBATY MONTPELLIER]
    INNER JOIN LIEN_CONJOINTS
    ON [COBATY MONTPELLIER].[N°] = LIEN_CONJOINTS.ID_ADHERENT;

    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Conjoint_adh_montp.*, [COBATY MONTPELLIER].*
    FROM Conjoint_adh_montp
    RIGHT JOIN [COBATY MONTPELLIER] 
    ON Conjoint_adh_montp.ID_CONJOINT = [COBATY MONTPELLIER].[N°];
    Ouai ça peut surement marcher, le problème est qu'il faut stocker la première requête quelque part pour y faire appel dans la seconde. Parlerais-tu de vue ? Et peut-on faire des vues sous access ?

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

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Ils appellent cela des requêtes dans l'interface d'access. Mais si je comprends bien tu accèdes aux données d'Access, non pas avec l'interface d'Access, mais via un language comme le VBA d'Access ou même d'autre chose, vu que visiblement tu n'a pas l'air de parler de l'interface Access où la première chose que l'on voit ce sont les onglets Tables, Requêtes, Formulaires, Etats, etc...

    Il faut que tu crées ta requête appelée par par la méthode CreateQuerydef mais j'en suis resté au versions d'il y a quelques années, le nom de la méthode a peut-être changée.

    Ou alors repartir de la requête qui semblait pas loin du résultat
    Cette requête fonctionne mais ne me renvoit malheureusement que les infos des adhérents et de leur conjoint respectif pour les adhérent ayant un conjoint. Les adhérents n'ayant pas de conjoint ne sont pas retenus, donc j'en reviens à mon problème initial
    et faire cela par exemple pour corriger le problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT [COBATY MONTPELLIER].*, [COBATY MONTPELLIER_1].*, 
    LIEN_CONJOINTS.ID_CONJOINT
    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°]
    WHERE ((([COBATY MONTPELLIER].[N°]) Is Not Null)) 
    OR (((LIEN_CONJOINTS.ID_CONJOINT) Is Null));

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 875
    Points : 53 050
    Points
    53 050
    Billets dans le blog
    6
    Par défaut
    vous avez de nombreux problemes car access ne supporte pas corrctement la syntaxe de la norme SQL de plus vous avez des noms de colonnes comme "No" qui ne respectent pas la norme> Les noms d'objets ne doivent comprendre que des lettres, des chiffres et le blanc souligne> Rine d'autre et surtout pas d'espaces> Vous courrez au devant d'emmerdes sans nombre si vous ne respectez pas cela>

    A +

Discussions similaires

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

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