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 :

[Access 2000] Faire un INNER JOIN derrière un LET JOIN


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 26
    Points
    26
    Par défaut [Access 2000] Faire un INNER JOIN derrière un LET JOIN
    Bonjour,
    J'ai un problème pour réaliser une liaison particulièrement complexe sous Access. Je tiens à remercier les courageux qui me liront jusqu'au bout et qui s'intéresseront à mon problème.

    Je crée une table "CoutArticle" dans laquelle j'ai 6 champs : CodeArticle, CoutMatiere, CoutTotal, CouTemps, CoutDecoupe, CoutVulcanisation et CoutSurface. CodeArticle, CoutMatiere et CoutTotal sont des données provenant d'une table Table2.

    CoutTemps est la somme de CoutTotal et CoutMatiere. CoutSurface est la somme de CoutDecoupe et CoutVulcanisation.

    Table1 contient le CodeArticle et un PrixStandard pour chaque article. Table2 contient les données de prix pour le calcul du CoutMatiere et du CoutTotal. On ne s'en occupera pas le problème que j'ai ici.
    La Table3 contient un CodeOperation, en fonction du CodeArticle, égal à "99996" (j'ai alors un CoutVulcanisation) ou "99997" (m'indiquant un CoutDecoupe) me donnant, pour chacun des deux, un TarifHoraire distinct.

    Ma Table1 contient deux enregistrements où le CodeArticle est égal à "99996" et "99997" avec des PrixStandard distincts.

    Le principe est, pour chaque CodeArticle, je calcule le CoutTemps par la Table2.
    Puis je calcule le CoutSurface par la Table3. Le cheminement de calcul est le suivant : dans ma Table1, j'ai un CodeArticle. Par cette donnée, je vais chercher dans la Table3 son CodeOperation. S'il est égal à "99996" ou "99997", je récupère le TarifHoraire correspondant. Par ce CodeOperation, je vais chercher dans ma Table1, qui contient deux enregistrement dont le CodeArticle est égal à "99996" et "99997", leur PrixStandard. Je fais ensuite ce calcul : TarifHoraire * PrixStandard.

    Ma première démarche a été de créer ma table CoutArticle avec mes CoutDecoupe, CoutVulcanisation et CoutSurface égaux à 0. J'effectuai ensuite 3 mises à jour de ma table CoutArticle afin de remplir ces 3 champs (CoutDecoupe, puis CoutVulcanisation, et enfin CoutSurface). Maintenant j'aimerais faire ces 4 requêtes en une seule. La liaison que j'aimerais faire ressemblerait donc à ceci :

    ((Table1 INNER JOIN Table2) LEFT JOIN Table3) INNER JOIN Table1

    J'ai deux cas possibles : Le CodeOperation est égal à "99996" ou "99997". J'ai donc 2 SELECT. J'ai pensé les introduire directement dans mon FROM. Voici don à quoi ressemblerait ma liaison :

    Table1 INNER JOIN Table2
    LEFT JOIN Table3-1 INNER JOIN Table1-1
    LEFT JOIN Table3-2 INNER JOIN Table1-2

    Or ce type de liaison (un INNER JOIN après un LEFT JOIN) m'est interdit sous Access, tout comme le RIGHT JOIN...
    J'ai donc pensé à intégrer directement les requêtes "Table3-1 INNER JOIN Table1-1" et "Table3-2 INNER JOIN Table1-2" directement dans mon FROM final.

    Table1-1 est obtenu par un SELECT de Table1 :
    SELECT CodeArticle, PrixStandard FROM Table1 WHERE Trim(Table1.CodeArticle) = "99997"

    Table3-1 est la requête suivante :
    SELECT Table3.CodeArticle, Table3.CodeOperation, Table3.TarifHoraire, Table1-1.PrixStandard AS PrixStandard FROM Table3 INNER JOIN [SELECT CodeArticle, PrixStandard FROM Table1 WHERE Trim(Table1.CodeArticle) = "99997"]. AS Table1-1 ON Table3.CodeArticle = Table1-1.CodeArticle WHERE Left(Table3.Code, 5) = "99997"

    J'ai donc intégré directement ma requête Table1-1 dans cette requête 3-1.

    De même j'obtiens la requête de Table 1-2 et Table 3-2 où le CodeOperation est "99996" :
    SELECT Table3.CodeArticle, Table3.CodeOperation, Table3.TarifHoraire, Table1-2.PrixStandard AS PrixStandard FROM Table3 INNER JOIN [SELECT CodeArticle, PrixStandard FROM Table1 WHERE Trim(Table1.CodeArticle) = "99996"]. AS Table1-2 ON Table3.CodeArticle = Table1-2.CodeArticle WHERE Left(Table3.Code, 5) = "99996"

    Je pense qu'il y a une erreur dans le premier SELECT des Table3-1/2, au moment où je fais appel à Table1-1/2.PrixStandard AS PrixStandard ; j'y fais appel trop tôt (puisqu'à ce moment-là, ma Table1/2 n'est pas encore créée...), mais je ne vois pas comment procéder autrement.

    Voilà donc le code de mon FROM final (je sais, c'est imbuvable, sincèrement désolé...) :

    FROM ((Table1 INNER JOIN Table2 ON Trim(Table1.CodeArticle) = Trim(Table2.CodeArticle)) LEFT JOIN [SELECT Table3.CodeArticle, Table3.CodeOperation, Table3.TarifHoraire, Table1-1.PrixStandard AS PrixStandard FROM Table3 INNER JOIN [SELECT CodeArticle, PrixStandard FROM Table1 WHERE Trim(Table1.CodeArticle) = "99997"]. AS Table1-1 ON Table3.CodeArticle = Table1-2.CodeArticle WHERE Left(Table3.CodeOperation, 5) = "99997"]. AS Table3-1 ON Trim(Table1.CodeArticle) = Trim(Table3.CodeArticle)) LEFT JOIN [SELECT Table3.CodeArticle, Table3.CodeOperation, Table3.TarifHoraire, Table1-2.PrixStandard AS PrixStandard FROM Table3 INNER JOIN [SELECT CodeArticle, PrixStandard FROM Table1 WHERE Trim(Table1.CodeArticle) = "99996"]. AS Table1-2 ON Table3.CodeArticle = Table1-2.CodeArticle WHERE Left(Table3.CodeOperation, 5)="99996"]. AS Table3-2 ON Trim(Table1.CodeArticle) = Trim(Table3-2.CodeArticle)

    A l'enregistrement de cette requête, j'obtiens un message d'erreur : "Syntax error in JOIN operation."
    Quelqu'un pourrait-il m'éclairer?
    D'avance merci de votre intérêt.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    UP...

    Juste peut-être pour réénoncer mon problème, comment faire une liaison du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Table1 LEFT JOIN Table2 ON Table1.[] = Table2.[]
          INNER JOIN Table3 ON Table2.[] = Table3.[]
    sachant que cette syntaxe est interdite ainsi que le RIGHT JOIN, dans Access 2000...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    UP...

    N'hésitez pas à me dire que c'est impossible, si vous pensez que ça l'est. Ou à me montrer mes erreurs/incohérences dans mon raisonnement. La description de ma démarche n'avait pour but que de vous relater ce que j'avais déjà entrepris.

    P.S. : Merci aux modos pour la correction apportée à ma mise en forme. Je ferais en sorte que vous n'ayez plus à le faire.

    D'avance merci.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    De nombreuses erreurs de syntaxe :
    1) la notation entre crochet est illégale
    2) une sous requête s'introduit par des parenthèses pas des crochets
    3) pas de point après des parenthèses
    4) les chaine de caractères sont etourée d'apostrophes pas de guilemets
    5) les chiffres ne sont pas délimité (ni apostrophe ni parenthèses)
    6) les noms d'objets ne doivent pas contenir de caracères illégaux (par exemple tiret comme dans Table1-1)
    ...

    Commencez donc par récrire votre requête proprement et en l'indendant si vous voulez de l'aide.

    Apprenez le langage SQL et non cette m... d'Access
    Mon site web comme mes bouquins peuvent vous y aider...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    FROM Table1 
         INNER JOIN Table2 
               ON Trim(Table1.CodeArticle) = Trim(Table2.CodeArticle)) 
         LEFT JOIN (SELECT Table3.CodeArticle, Table3.CodeOperation, Table3.TarifHoraire, Table1-1.PrixStandard AS PrixStandard 
                    FROM   Table3 
                           INNER JOIN (SELECT CodeArticle, PrixStandard 
                                       FROM Table1 
                                       WHERE Trim(Table1.CodeArticle) = '99997') AS 
                                 ON Table3.CodeArticle = Table1-2.CodeArticle 
                    WHERE Left(Table3.CodeOperation, 5) = '99997') AS Table3-1 
              ON Trim(Table1.CodeArticle) = Trim(Table3.CodeArticle)) 
    ...
    A +

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 47
    Points : 26
    Points
    26
    Par défaut
    1) Je travaille sous Access 2000 et il fonctionne avec les crochets
    2) idem 1
    3) Ici, aussi Access est en cause ; il me demande un "." après mes crochets pour renommer mon SELECT.
    4) Ici encore, Access me demande des guillemets pour introduire une chaine de caractère. Mais je vais essayer les apostrophes, voir s'il l'accepte.
    5)Oui, mais ici, mes données chiffrées sont des chaines de caractères.
    6)Les caractères illégaux ne sont utilisés que pour illustrer mon exemple. En fait mes tables sont des contractions de mots allemand. Afin que mon explication soit plus claire, j'ai préféré renommer mes tables. C'était maladroit, vous avez raison.

    Pour l'indentation, je m'en excuse, mais je pensais qu'une requête pareille serait illisible même indentée. J'ai donc optée pour des couleurs afin de mettre en valeur mes différents "modules"... Un mauvais choix de ma part...

    L'outil qui m'a été imposé a été Access 2000, je n'ai donc pas le choix du langage. Je m'appuie essentiellement sur vos cours et je continue d'apprendre grâce à votre contribution. J'ai d'ailleurs trouvé ma solution grâce à un de vos cours ; c'était un problème d'organisation. J'ai tout repris depuis zéro en appliquant votre méthode et la solution est venue facilement.

    Encore merci de votre intérêt. La prochaine fois, je m'appliquerai à la présentation de mon code.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Access 2000 - plusieurs inner join
    Par kekesilo dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 02/04/2008, 18h36
  2. Réponses: 8
    Dernier message: 24/07/2007, 09h06
  3. Réponses: 3
    Dernier message: 12/09/2006, 15h05
  4. Réponses: 5
    Dernier message: 03/08/2006, 16h56
  5. [Access 2000] LEFT JOIN un peu complexe
    Par Miss Ti dans le forum Langage SQL
    Réponses: 20
    Dernier message: 02/08/2006, 16h04

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