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

Développement SQL Server Discussion :

Jointure Gauche ne fonctionne pas comme prévu


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 11
    Points
    11
    Par défaut Jointure Gauche ne fonctionne pas comme prévu
    Je travail sur une extraction de Contacts (OCPR) et de d'organismes Partenaires (OCRD).
    une première requête très simple renvoie 5589 Lignes conformes à mon attente

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T0.[CntctCode], T0.[CardCode], T0.[Name]
    FROM OCPR T0 INNER JOIN OCRD T1 ON T0.[CardCode] = T1.[CardCode]
    WHERE T0.[Active] ='Y' AND  T1.[CardType] <> 'S'
    ORDER BY T0.[CardCode], T0.[CntctCode]
    La table OCRD a un table liée CRD1 contenant les différentes adresses des Partenaires, avec notamment une colonne caractérisant le type d'adresse, livraison (S) ou facturation (B). une liaison a été créée entre la colonne [Notes2] de Contacts (OCPR) vers CRD1 pour déterminer à quelle adresse un contact est rattaché. Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T0.[CntctCode], T0.[CardCode], T0.[Name]
    FROM OCPR T0 INNER JOIN OCRD T1 ON T0.[CardCode] = T1.[CardCode]
    INNER JOIN CRD1 T2 ON T0.[CardCode] = T2.[CardCode] AND T0.[Notes2] = T2.[Address]
    WHERE T0.[Active] ='Y' AND  T1.[CardType] <> 'S' AND  T2.[AdresType] ='S'
    ORDER BY T0.[CardCode], T0.[CntctCode]
    On filtre seulement les adresses de livraisons sachant qu'il peut exister des adresses de livraison et de facturation avec une colonne T2.[Address] identique.

    J'obtiens 4449 lignes, sachant que la colonne [Notes2] de certains contacts est NULL ou renseignée par une valeur inexistante dans CRD1. Jusque là tout est normal, mais pour obtenir les 5589 lignes d'origine il me semblait qu'il suffisait de changer le type de jointure et ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T0.[CntctCode], T0.[CardCode], T0.[Name]
    FROM OCPR T0 INNER JOIN OCRD T1 ON T0.[CardCode] = T1.[CardCode]
    LEFT JOIN CRD1 T2 ON T0.[CardCode] = T2.[CardCode] AND T0.[Notes2] = T2.[Address]
    WHERE T0.[Active] ='Y' AND  T1.[CardType] <> 'S' AND  T2.[AdresType] ='S'
    ORDER BY T0.[CardCode], T0.[CntctCode]
    me renvoie exactement le même nombre de lignes 4449.

    Une idée ? Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Le fait de filtrer dans le WHERE des informations de votre table t2 transforme votre jointure externe en jointure forte, puisque vous n'acceptez de facto pas les nulls en sortie de jointure.
    Essayez ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        select T0.[CntctCode]
             , T0.[CardCode]
             , T0.[Name]
          from OCPR as T0
    inner join OCRD as T1  on T1.[CardCode]  = T0.[CardCode]
     left join CRD1 as T2  on T2.[CardCode]  = T0.[CardCode]
                          and T2.[Address]   = T0.[Notes2]
                          and T2.[AdresType] = 'S'
         where T0.[Active]    = 'Y'
           and T1.[CardType] <> 'S'
      order by T0.[CardCode]
             , T0.[CntctCode]

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 29
    Points : 11
    Points
    11
    Par défaut
    Bingo ! Je m'en veux même de ne pas avoir su regarder ce qu'il fallait voir .

    Merci bien.

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

Discussions similaires

  1. Boucle, ne fonctionne pas comme prévu
    Par ArzelPRO dans le forum Langage
    Réponses: 7
    Dernier message: 03/02/2019, 22h18
  2. Mon serveur proxy ne fonctionne pas comme prévu
    Par win_ubuntu dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 28/04/2015, 19h34
  3. Réponses: 2
    Dernier message: 15/04/2015, 10h30
  4. Filtrage au niveau de la requête qui ne fonctionne pas comme prévu
    Par hartecel dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/06/2008, 14h06
  5. [Bonne pratique] merge qui ne fonctionne pas comme prévu
    Par forex dans le forum Subversion
    Réponses: 1
    Dernier message: 19/05/2008, 04h28

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