Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème multiple jointure

    13 septembre 2017 à 16:05:50

    Bonjour à tous.
    Je me tourne vers vous avec ma question concernant une requête que j'ai à monter et j'avoue ne pas savoir comment m'y prendre.
    Tout d'abord, voici une image de ma requête dans le designer de SQLServer. 
    Très simple en soit. On remarque les LEFT OUTER JOIN à chaque jointure. les tables Passation et PassationAuSujetDe sont en fait la même table avec des alias différents. Voici maintenant la requête qui a été construite.
    On remarque, en jaune, le AND qui a été ajouté alors que, selon moi, on devrait voir une jointure. J'ai aussi de la difficulté à comprendre le début de la clause FROM avec les deux LEFT OUTER JOIN de suite.
    Le AND ajouté vient fausser mes résultats car il m'enlève certaines lignes, notamment celles dont les V_rech_Q_GED.idPassation ou V_rech_Q_ASQ.idPassation sont nulls. Malgré toutes les modifications que j'ai faites à ma requête, je n'arrive pas à me débarrasser du AND.
    J'ai tenté j'ajouter à la main une jointure vers la table passation, mais le compilateur crée une nouvelle instance de la table et la renomme passation_1. De quelle façon est-ce que je peux ajouter une jointure vers une table qui est déjà référencée dans ma clause FROM?
    Merci beaucoup

    -
    Edité par Kitiara 13 septembre 2017 à 16:24:44

    • Partager sur Facebook
    • Partager sur Twitter
      13 septembre 2017 à 16:13:55

      Bonjour,

      Il n'y a pas de copie d'écran sur ton message.

      Au passage il sera plus pratique (et lisible) de mettre tes requêtes en utilisant la balise code (bouton </> dans l'éditeur de message). ;)

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        13 septembre 2017 à 16:27:06

        Merci :) j'ai remis les images correctement.
        • Partager sur Facebook
        • Partager sur Twitter
          13 septembre 2017 à 17:02:48

          Je ne suis pas sûr de comprendre le modèle, mais je ferais plutôt ceci :

          SELECT P.idPassation, PG.idPassation, PG.idPassation
          FROM
          	Passation P
          		LEFT JOIN V_rech_Q_GED G
          			ON P.idPassation = G.idPassation
          		LEFT JOIN V_rech_Q_ASQ A
          			ON P.idPassation = A.idPassation
          		LEFT JOIN Passation PG
          			ON G.idPassationAuSujetDe = PG.idPassation
          		LEFT JOIN Passation PA
          			ON A.idPassationAuSujetDe = PA.idPassation

          On part des passations, que l'on relie aux deux vues GED et ASQ, puis chacune des vues que l'on relie aux passations selon AuSujetDe ...

          -
          Edité par Benzouye 13 septembre 2017 à 17:25:14

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            13 septembre 2017 à 17:19:09

            Salut

            Merci pour ta réponse!! :)

            Malheureusement cette solution me ramène à ma problématique que ma table passation se dédouble. Je voudrais que PG et PA soit la même entité.

            • Partager sur Facebook
            • Partager sur Twitter
              13 septembre 2017 à 17:29:59

              EmManuelle3 a écrit:

              Je voudrais que PG et PA soit la même entité.

              Cela n'est possible que si c'est la même passation qui est référencée comme AuSujetDe dans les vues ... Tu pars d'une passation donnée que tu relies à deux vues différentes. Il est possible donc que pour cette même passation, tu n'ais pas le même idPassationAuSujetDe dans chacune des vues ... non ? Si c'est non, alors tu peux supprimer une jointure :

              SELECT P.idPassation, PG.idPassation
              FROM
                  Passation P
                      LEFT JOIN V_rech_Q_GED G
                          ON P.idPassation = G.idPassation
                      LEFT JOIN V_rech_Q_ASQ A
                          ON P.idPassation = A.idPassation
                      LEFT JOIN Passation PG
                          ON G.idPassationAuSujetDe = PG.idPassation
                          AND A.idPassationAuSujetDe = PG.idPassation

              Mais si tu as deux idPassationAuSujetDe différents, alors cette requête ne te retournera rien pour PG ...

              EmManuelle3 a écrit:

              cette solution me ramène à ma problématique que ma table passation se dédouble

              Je ne vois pas le problème. Si tu as deux idPassationAuSujetDe différents pour une passation de départ, alors tu auras besoin de deux jointures ...

              Encore une fois, je ne connais pas le modèle ... C'est toi seule qui peut répondre ...

              -
              Edité par Benzouye 13 septembre 2017 à 17:31:06

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                13 septembre 2017 à 17:54:16

                Merci beaucoup

                J'ai essayé ta requête et elle ne me retourne pas tout à fait ce que je veux. Il existe des cas où j'ai un idPassationAuSujetDe pour GED et pas pour ASQ et vice versa. Avec cette requête, elle ne me retourne pas ces cas là.

                Je suis bien embêtée

                 EDIT

                J'ai résolu mon problème. Je tentais de faire une boucle entre mes tables, de faire ma requête en "parallèle" mais je devais y aller en séquence.


                Je vous mets l'image de la requête ainsi que la requête elle-même.



                -
                Edité par Kitiara 13 septembre 2017 à 19:27:07

                • Partager sur Facebook
                • Partager sur Twitter
                  14 septembre 2017 à 8:47:22

                  EmManuelle3 a écrit:

                  Il existe des cas où j'ai un idPassationAuSujetDe pour GED et pas pour ASQ et vice versa

                  Dans ta dernière requête, si GED ou ASQ ne contient pas d'idPassationAuSujetDe, alors tu ne remontes rien du tout pour AuSujetDe ...

                  D'où mes deux jointures sur mon post d'avant ...

                  SELECT P.idPassation, COALESCE( PG.idPassation, PA.idPassation ) AS AuSujetDe
                  FROM
                      Passation P
                          LEFT JOIN V_rech_Q_GED G
                              ON P.idPassation = G.idPassation
                          LEFT JOIN V_rech_Q_ASQ A
                              ON P.idPassation = A.idPassation
                          LEFT JOIN Passation PG
                              ON G.idPassationAuSujetDe = PG.idPassation
                          LEFT JOIN Passation PA
                              ON A.idPassationAuSujetDe = PA.idPassation

                  Là cela devrait faire vraiment ce sur tu souhaites ... Par contre si G et A ont un idPassationAuSujetDe différent ... tu en perds un des deux ... dans ce cas là c'est ASQ qui ne sera pas retourné ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                  Problème multiple jointure

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown