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

Requêtes et SQL. Discussion :

Remplacement de jointures


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Points : 8
    Points
    8
    Par défaut Remplacement de jointures
    Bonjour,

    Je viens à vous car je suis confronté à un dilemne ! Je dois modifier une requête pour afficher le contenu d'une colonne d'une table en plus des autres éléments présent dans la requête.

    Voici la requête initiale (tres pas beau ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT [Matières 1eres].[Code MP], [Matières 1eres].[Dénomination MP], [Matières 1eres].Acheteur, [Matières 1eres].[Code frs], Fournisseurs.[Nom Fournisseur], [Matières 1eres].[Réf frs], [Matières 1eres].Analyse, PSO.[Code PSO], PSO.Désignation, PSO.Client, [Matières 1eres].Observations, [Matières 1eres].Suspension, PSO.Suspension, [Détail formule].[Qté Formule], [Matières 1eres].[Unité mesure]
    FROM Fournisseurs INNER JOIN (([Matières 1eres] LEFT JOIN [Détail formule] ON [Matières 1eres].[Code MP]=[Détail formule].[Code MP]) LEFT JOIN PSO ON [Détail formule].[Code PSO]=PSO.[Code PSO]) ON Fournisseurs.[Code frs]=[Matières 1eres].[Code frs]
    WHERE ((([Matières 1eres].[Code MP])>"000009" AND ([Matières 1eres].[Code MP])<>"032M00" AND ([Matières 1eres].[Code MP])<>"007M00") AND (([Matières 1eres].Suspension)=No) AND ((PSO.Suspension)=No)) AND (([Produits finis].[Type de PF])<>"médicament")
    ORDER BY [Matières 1eres].[Code MP];
    Donc je dois rajouter la dedans la colonne [Type de produits] qui est un champ de type texte avec 3 choix possible dans une liste déroulante ("médicament", "liquide", "extrait") de la table [Produits finis] et l'afficher en excluant toutes les lignes qui contiennent le type suivant : "médicament".

    En voyant toutes ces jointures imbriquées, je dois avouer que je n'y comprends rien et que je n'arriverais pas à la modifier.

    Cependant, je crois qu'il est possible de "transformer" ces jointures en requêtes imbriquées ou autres... J'ai fait un truc de ce style, mais cela ne fonctionne pas :

    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
     
    SELECT MP.[Code MP], MP.[Dénomination MP], MP.Acheteur, MP.[Code frs], F.[Nom Fournisseur], MP.[Réf frs], MP.Analyse, PSO.[Code PSO], PSO.Désignation, PF.[Type de PF], PSO.Client, MP.Observations, MP.Suspension, PSO.Suspension, DF.[Qté Formule], MP.[Unité mesure]
    FROM [Matières 1eres] AS MP, Fournisseurs AS F, PSO, [Produits finis] AS PF, [Détail formule] AS DF
    WHERE MP.[Code frs] = F.[Code frs]
    AND DF.[Code MP] = MP.[Code MP]
    AND DF.[Code MP] IS NULL
    AND PSO.[Code PSO] = DF.[Code PSO]
    AND PSO.[Code PSO] IS NULL
    AND MP.[Code MP] > "000009"
    AND MP.[Code MP] <>"032M00"
    AND MP.[Code Mp] <>"007M00"
    AND MP.Suspension = No
    AND PSO.Suspension = No
    AND PF.[Type de PF] <> "médicament"
    ORDER BY MP.[Code MP];
    Je ne sais vraiment pas si ce que j'ai fait est logique ou pas, je comprends pas trop la requête initiale en fin de compte...

    Merci de l'aide que vous m'apporterez !

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Même si il s'agit d'access, indenté vos clauses pour la lecture :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    SELECT [Matières 1eres].[Code MP]
             , [Matières 1eres].[Dénomination MP]
             , [Matières 1eres].Acheteur
             , [Matières 1eres].[Code frs]
             , Fournisseurs.[Nom Fournisseur]
             , [Matières 1eres].[Réf frs]
             , [Matières 1eres].Analyse
             , PSO.[Code PSO]
             , PSO.Désignation
             , [Produits finis].[Type de PF]
             , PSO.Client
             , [Matières 1eres].Observations
             , [Matières 1eres].Suspension
             , PSO.Suspension
             , [Détail formule].[Qté Formule]
             , [Matières 1eres].[Unité mesure]
             , [Produits finis].[Type de produits]
    FROM 
            Fournisseurs INNER JOIN (([Matières 1eres] LEFT JOIN [Détail formule]
                             ON [Matières 1eres].[Code MP]=[Détail formule].[Code MP]) LEFT JOIN PSO 
                             ON [Détail formule].[Code PSO]=PSO.[Code PSO]) 
                             ON Fournisseurs.[Code frs]=[Matières 1eres].[Code frs]
         /* Ajout de la jointure non définie dans ta 2ème requête */
     
    WHERE 
                ((([Matières 1eres].[Code MP])>"000009" 
          AND ([Matières 1eres].[Code MP])<>"032M00" 
          AND ([Matières 1eres].[Code MP])<>"007M00") 
          AND (([Matières 1eres].Suspension)=No) 
          AND ((PSO.Suspension)=No)) 
          AND (([Produits finis].[Type de PF])<>"médicament")
     
    ORDER BY 
                 [Matières 1eres].[Code MP];
    Il te manque la jointure correspondante à ta table "Produits finis".


  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup Chtulus mais je ne vois vraiment pas comment ajouter ma jointure pour la table [Produits finis]... J'ai tout le temps des erreurs...

    Dois-je juste rajouter un inner join ?

    Merci d'avance

  4. #4
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Oui, quelles sont les PK et FK sur cette table ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Oui donc, la PK de la table [Produits finis] est : le champ [Code Produit], et apparemment je ne vois pas de Foreign Key.

  6. #6
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Dans les autres tables...

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Je suis dans Access 2003 et je ne vois pas de FK... cela ne m'indique que les clés primaires (et je n'en voit pas des masses )

    Merci encore Chtulus de ta patience !

  8. #8
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Vous n'avez pas par hasard une notion de code formule dans votre Produit fini ??

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Yanika_bzh Voir le message
    Vous n'avez pas par hasard une notion de code formule dans votre Produit fini ??
    késako ?

  10. #10
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    J'essayais de trouver la relation possible manquante ...
    1 PF est créé a l'aide d'une Formule n'est ce pas ? N'est ce pas cette relation qui vous manque ??

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Je n'ai pas concu la base de données et je dois avouer qu'elle est bien poussiéreuse... enfin bref...

    J'ai fait un truc, dites moi si j'ai fait n'importe quoi, mais cela a peut être un rapport avec vos questions sur les relations.

    J'ai afficher les relations et j'ai rajouter la table [Produits finis] puis j'ai mis une relation de [Produits finis].[Code PSO] vers [Détail formule].[Code PSO] avec l'option du type de jointure n° 1 : "Inclure seulement les lignes des deux tables pour lesquelles les champs joints sont égaux".



    J'ai donc ajouter cela dans mon code :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     SELECT [Matières 1eres].[Code MP]
             , [Matières 1eres].[Dénomination MP]
             , [Matières 1eres].Acheteur
             , [Matières 1eres].[Code frs]
             , Fournisseurs.[Nom Fournisseur]
             , [Matières 1eres].[Réf frs]
             , [Matières 1eres].Analyse
             , PSO.[Code PSO]
             , PSO.Désignation
             , [Produits finis].[Type de PF]
             , PSO.Client
             , [Matières 1eres].Observations
             , [Matières 1eres].Suspension
             , PSO.Suspension
             , [Détail formule].[Qté Formule]
             , [Matières 1eres].[Unité mesure]
    FROM 
            Fournisseurs INNER JOIN (([Matières 1eres] LEFT JOIN [Détail formule]
                           ON [Matières 1eres].[Code MP]=[Détail formule].[Code MP]) LEFT JOIN PSO 
                           ON [Détail formule].[Code PSO]=PSO.[Code PSO]) 
                           ON Fournisseurs.[Code frs]=[Matières 1eres].[Code frs]
                                 INNER JOIN ([Produits finis]
                           ON [Produits finis].[Code PSO]=[Détail formule].[Code PSO])
     
    WHERE 
                ((([Matières 1eres].[Code MP])>"000009" 
          AND ([Matières 1eres].[Code MP])<>"032M00" 
          AND ([Matières 1eres].[Code MP])<>"007M00") 
          AND (([Matières 1eres].Suspension)=No) 
          AND ((PSO.Suspension)=No)) 
          AND (([Produits finis].[Type de PF])<>"médicament")
     
    ORDER BY 
                 [Matières 1eres].[Code MP];
    Mais cela ne fonctionne pas... "Erreur de syntaxe (opérateur absent) dans l'expression 'Fournisseurs.Code frs]=[Matières 1eres].[Code frs] INNER JOIN blabla jusqu'à =[Détail formule].[code PSO]'"

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Heu... apparemment mon précédent message à été supprimé... bon ben c'est pas grave.. Je recommence donc :

    J'ai essayé comme indiqué dans le code précédent et l'erreur revient même quand je met des parenthèses. L'erreur est toujours la même et me paraît bizarre puisqu'il n'y a apparement pas, dumoins pas à ma connaissance, d'erreur de syntaxe.

    Ai-je bien fait pour la relation de tables? Ai-je bien écrit le code ? Pouvez-vous m'éclairer?

    Merci d'avance !

  13. #13
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Il faut reprendre l'arborescence des jointures et bien les décomposer.


  14. #14
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    bonjour,

    Tes jointures avec la ligne que tu as ajouté donnerait cela à quelques parenthèses près:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Fournisseurs INNER JOIN (([Matières 1eres] LEFT JOIN ([Détail formule] INNER JOIN ([Produits finis]
                           ON [Produits finis].[Code PSO]=[Détail formule].[Code PSO])
                           ON [Matières 1eres].[Code MP]=[Détail formule].[Code MP])) LEFT JOIN PSO 
                           ON [Détail formule].[Code PSO]=PSO.[Code PSO]) 
                           ON Fournisseurs.[Code frs]=[Matières 1eres].[Code frs]
    Seulement d'après ton modèle, je remarque que les champs "s_Generation" et "s_GUID" sont présentes dans presque toutes tes tables. A quoi cela correspond ?

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Merci Chtulus pour ce dévouement !

    Cela ne fonctionne toujours pas mais après quelques recherche j'ai trouvé ceci : "Une jointure LEFT JOIN ou RIGHT JOIN peut être imbriquée dans une jointure INNER JOIN mais il est impossible d'imbriquer une jointure INNER JOIN dans une jointure LEFT JOIN ou RIGHT JOIN." (cf. ce document). Tient-on une piste ?

    PS : Les deux champs que tu cites, je ne sais pas à quoi ils correspondent...

    Merci encore !

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Je reste dans l'impasse.... c'est assez frustrant je dois dire, les erreurs de Microsoft ne sont pas assez explicites...

    J'ai beau chercher, ben je ne trouve pas !


  17. #17
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Re,

    Tu n'as plus qu'à la faire en QBE (Si ce n'est déjà le cas) et voir ce que cela donne !


  18. #18
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 804
    Points : 34 074
    Points
    34 074
    Billets dans le blog
    14
    Par défaut
    Access a une fâcheuse tendance à mettre des parenthèses partout et d'imbriquer les jointures de manière difficilement lisibles. A l'inverse, écrire une requête propre avec des jointures imbriquées et sans parenthèses peut ne pas être compris par Access.
    Le mieux est de dessiner la requête de manière graphique dans le générateur de requête d'Access et de voir ensuite le code 'pseudo' SQL généré par Access.

Discussions similaires

  1. [Access] Jointure et remplacement sql
    Par matel dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/09/2008, 19h30
  2. Réponses: 12
    Dernier message: 12/03/2008, 17h56
  3. Remplacer une sous-requête par une jointure
    Par MPQuatre dans le forum Requêtes
    Réponses: 6
    Dernier message: 05/12/2007, 18h28
  4. Réponses: 6
    Dernier message: 23/01/2007, 11h17
  5. Remplacer une jointure dans une requête DELETE
    Par lorant dans le forum Requêtes
    Réponses: 5
    Dernier message: 30/11/2006, 20h46

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