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

MS SQL Server Discussion :

[MSDE] SELECT et LEFT OUTER JOIN


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de joefou
    Profil pro
    Inscrit en
    Février 2005
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 248
    Par défaut [MSDE] SELECT et LEFT OUTER JOIN
    Salut à tous !

    J'essaye de faire une requête de sélection en liant plusieures tables.

    Je souhaiterais obtenir un nombre de ligne qui soit en rapport avec ma première table, c'est à dire DemandeProduit, je voudrais que quel que soit le nombre d'enregistrements correspondants dans les autres tables liées, j'ai toujours mes lignes issues de DemandeProduit selon les restrictions propre à cette table.

    La requête est la suivante:

    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
     
     
    SELECT TourneeMagasin.ordre, 
    DemandeProduit.numerobon,
    DemandeProduit.codeproduit,
    DemandeProduit.quantite,
    Produit.libelle,
    MagasinProduit.codemagasin,
    MagasinProduit.emplacement 
    FROM DemandeProduit 
    LEFT OUTER JOIN Produit ON DemandeProduit.codeproduit=Produit.code 
    INNER JOIN MagasinProduit ON DemandeProduit.codeproduit=MagasinProduit.codeproduit 
    LEFT OUTER JOIN TourneeMagasin ON TourneeMagasin.codeproduit=DemandeProduit.codeproduit
    WHERE DemandeProduit.numerobon='3' 
    AND DemandeProduit.quantite<>0 
    AND MagasinProduit.codemagasin='01' 
    AND TourneeMagasin.codemagasin='01' 
    ORDER BY TourneeMagasin.ordre,
    DemandeProduit.numerobon,
    MagasinProduit.codemagasin,
    MagasinProduit.emplacement,
    Produit.libelle;
    La structure des tables est la suivante:

    DemandeProduit:
    numerobon / clé
    codeproduit / clé
    quantite

    Produit:
    code / clé
    libelle

    MagasinProduit:
    codemagasin / clé
    codeproduit / clé
    emplacement

    TourneeMagasin:
    codemagasin / clé
    codeproduit / clé
    ordre

    cette dernière avec les enregistrements suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    codemagasin   codeproduit   ordre
    01                 10020           1
    02                 82228           2
    01                 10040           3
    J'ai cru comprendre que le LEFT OUTER JOIN se comportait de façon à conserver les lignes de la partie gauche sans considérer ce que l'on pourrait avoir de la partie droite, et si ça n'existe pas, les champs sont mis à Null.
    Or si dans ma table TourneeMagasin il me manque des enregistrements correspondants, le résultat final ne comportera que les lignes qui auront au moins une valeur pour chaque champ.

    Plus précisement, si je retire de ma requête toutes les références à la table TourneeMagasin, j'obtiens ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    numerobon    codeproduit    quantite    libelle    codemagasin    emplacement
    3              10020            8.000       aaa       01      	      A      
    3              10040            6.000       bbb       01      	      B      
    3              82228            16.00       cccc      01              B
    La requête telle qu'elle est me donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    ordre    numerobon    codeproduit    quantite    libelle    codemagasin    emplacement
    1         3             10020            8.000       aaa       01             A      
    3         3             10040            6.000       bbb       01      	     B

    Alors que je m'attendais à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    ordre    numerobon    codeproduit    quantite    libelle    codemagasin    emplacement
    1         3             10020            8.000       aaa       01      	      A
    Null      3             82228            6.000       bbb       01      	      B       
    3         3             10040            6.000       bbb       01      	      B
    Ai-je commis une ou des erreur(s) dans la requête ?

    D'avance merci !

  2. #2
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    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
    SELECT T.ordre, 
    D.numerobon,
    D.codeproduit,
    D.quantite,
    Produit.libelle,
    M.codemagasin,
    M.emplacement 
    FROM DemandeProduit D 
    LEFT OUTER JOIN Produit P 
              ON D.codeproduit=P.code 
    LEFT OUTER MagasinProduit M 
            ON D.codeproduit=M.codeproduit 
    LEFT OUTER JOIN TourneeMagasin T 
            ON T.codeproduit=D.codeproduit
    WHERE D.numerobon=3
    AND D.quantite<>0 
    AND M.codemagasin='01' 
    AND T.codemagasin='01' 
    ORDER BY T.ordre,
    D.numerobon,
    M.codemagasin,
    M.emplacement,
    P.libelle;

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  3. #3
    Membre éclairé Avatar de joefou
    Profil pro
    Inscrit en
    Février 2005
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 248
    Par défaut
    Salut Laurent !

    J'ai essayé la requête qu'avec des LEFT OUTER JOIN comme tu me l'as indiqué, mais j'obtiens toujours le même résultat:

    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
     
     
    SELECT T.ordre, 
    D.numerobon,
    D.codeproduit,
    D.quantite,
    P.libelle,
    M.codemagasin,
    M.emplacement 
    FROM DemandeProduit D 
    LEFT OUTER JOIN Produit P 
              ON D.codeproduit=P.code 
    LEFT OUTER JOIN MagasinProduit M 
            ON D.codeproduit=M.codeproduit 
    LEFT OUTER JOIN TourneeMagasin T 
            ON T.codeproduit=D.codeproduit
    WHERE D.numerobon=3
    AND D.quantite<>0 
    AND M.codemagasin='01' 
    AND T.codemagasin='01' 
    ORDER BY T.ordre,
    D.numerobon,
    M.codemagasin,
    M.emplacement,
    P.libelle;
    Résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    ordre    numerobon    codeproduit    quantite    libelle    codemagasin    emplacement
    1         3             10020            8.000       aaa       01             A      
    3         3             10040            6.000       bbb       01      	      B

  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
    22 008
    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 : 22 008
    Billets dans le blog
    6
    Par défaut
    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
    SELECT TM.ordre, 
           DP.numerobon,
           DP.codeproduit,
           DP.quantite,
           P.libelle,
           MP.codemagasin,
           MP.emplacement 
     
    FROM   DemandeProduit DP
           LEFT OUTER JOIN Produit P 
                ON DP.codeproduit = P.code 
           INNER JOIN MagasinProduit MP 
                ON DP.codeproduit = MP.codeproduit 
           LEFT OUTER JOIN TourneeMagasin TM 
                ON TM.codeproduit = DP.codeproduit
                   AND TM.codemagasin='01'
     
    WHERE  DP.numerobon ='3' 
    AND    DP.quantite<>0 
    AND    MP.codemagasin='01' 
     
    ORDER BY TM.ordre, DP.numerobon, MP.codemagasin,
          MP.emplacement, P.libelle;
    Votre filtre TM.codemagasin='01' dans la clause WHERE empêche la jointure externe. Il faut, soit le mettre dans la clause ON (comme ci dessus) soit rajouter OR TM.codemagasin IS NULL (comme ci dessous) :

    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
    SELECT TM.ordre, 
           DP.numerobon,
           DP.codeproduit,
           DP.quantite,
           P.libelle,
           MP.codemagasin,
           MP.emplacement 
     
    FROM   DemandeProduit DP
           LEFT OUTER JOIN Produit P 
                ON DP.codeproduit = P.code 
           INNER JOIN MagasinProduit MP 
                ON DP.codeproduit = MP.codeproduit 
           LEFT OUTER JOIN TourneeMagasin TM 
                ON TM.codeproduit = DP.codeproduit
     
    WHERE  DP.numerobon ='3' 
    AND    DP.quantite<>0 
    AND    MP.codemagasin='01' 
    AND    TM.codemagasin='01' OR TM.codemagasin IS NULL
     
    ORDER BY TM.ordre, DP.numerobon, MP.codemagasin,
          MP.emplacement, P.libelle;
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre éclairé Avatar de joefou
    Profil pro
    Inscrit en
    Février 2005
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 248
    Par défaut
    Et bien c'est nickel ! j'obtiens ce qu'il me faut à présent !

    Merci à vous pour votre SQLpro et Laurent !

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

Discussions similaires

  1. Left outer join sur Select multitable
    Par ChrOnOs83 dans le forum Requêtes
    Réponses: 1
    Dernier message: 21/01/2009, 17h16
  2. Réponses: 6
    Dernier message: 06/10/2006, 23h15
  3. Problème avec left outer join
    Par jgfa9 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2005, 21h07
  4. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17
  5. concatenation de chaine dans un left outer join
    Par the_edge dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/11/2004, 16h08

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