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 :

Requête LEFT JOIN ON si condition


Sujet :

Développement SQL Server

  1. #1
    Membre éprouvé
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Points : 1 116
    Points
    1 116
    Par défaut Requête LEFT JOIN ON si condition
    Bonjour,
    sur SQL server 2008

    Je voudrais combiné un left join table on si existe alors...

    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 BMBOM_LINE_CODE , BMBOM_ITEM_CODE ,Nom_Dessin,BMBOM_LINE_CODE_C,BMBOM_ITEM_CODE_C
     
    FROM sad.dbo.sad_bmbom 
    left JOIN [IMP].[dbo].[New_Qte_Remorque] on
     
    if Nom_Dessin  =  SUBSTRING(BMBOM_ITEM_CODE,7,20) then
    Nom_Dessin  =  SUBSTRING(BMBOM_ITEM_CODE,7,20)
    elseif Nom_Dessin  =  SUBSTRING(BMBOM_ITEM_CODE,7,2) then
            Nom_Dessin  =  SUBSTRING(BMBOM_ITEM_CODE,7,2)
    elseif Nom_Dessin  =  SUBSTRING(BMBOM_ITEM_CODE,7,1) then
            Nom_Dessin  =  SUBSTRING(BMBOM_ITEM_CODE,7,1)
    end if
     
    ORDER BY BMBOM_LINE_CODE,BMBOM_ITEM_CODE,Nom_Dessin
    Mais bien sur cela ne fonctionne pas.
    J'ai essayé avec un Case

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ....
    left JOIN [IMP].[dbo].[New_Qte_Remorque] on
     
    case
    	when Nom_Dessin  =  SUBSTRING(BMBOM_ITEM_CODE,7,20) then Nom_Dessin
    	when Nom_Dessin  =  SUBSTRING(BMBOM_ITEM_CODE,7,2) then Nom_Dessin
    	when Nom_Dessin  =  SUBSTRING(BMBOM_ITEM_CODE,7,1) then Nom_Dessin
    end=Nom_Dessin
    ....
    mais je n'ai pas le résultat que je veux,
    car si les 3 (when Nom_Dessin = ... existe)
    alors il m’apparaît les 3 dans le résultat.
    moi ce que je veux est si le premier existe ne cherche pas le 2e et 3e
    si le premier n'existe pas cherche le 2e, si il existe ne cherche pas le 3e
    et si le 2e n'existe pas cherche le 3e
    si non la valeur est NULL


    Merci à l'avance!

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 698
    Points : 586
    Points
    586
    Par défaut
    Heum, c'est normal que les 3 options du case retournent la même valeur ?

    C'est peut être ça que vous chercher ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON Nom_Dessin = SUBSTRING(BMBOM_ITEM_CODE,7,20) OR Nom_Dessin = SUBSTRING(BMBOM_ITEM_CODE,7,2) OR Nom_Dessin = SUBSTRING(BMBOM_ITEM_CODE,7,1)

  3. #3
    Membre éprouvé
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Points : 1 116
    Points
    1 116
    Par défaut
    Merci d'avoir répondu Donpi

    Voici 2 tables

    Table_1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Colonne1_Table1       Colonne2_Table1
     
    123456AA1                 123456A01
    123456AA1                 123456A02
    123456AA1                 123456A03
    123456BB1                 123456B01
    123456BB1                 123456B02
    123456BB1                 123456B03
    123456CC1                 123456C01
    123456CC1                 123456C02
    123456CC1                 123456C03

    Table_2

    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
    Colonne1_Table2
     
    A
    AA
    AA1
    B
    BB
    BB1
    C
    D
    E
    EE
    EE1
    F
    G
    avec ce Code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT Colonne1_Table1, Colonne2_Table1, Colonne1_Table2
     
    FROM sad.dbo.sad_bmbom 
    left JOIN [IMP].[dbo].[New_Qte_Remorque] on
     
    case
    	when Colonne1_Table2=  SUBSTRING(Colonne1_Table1,7,20) then Colonne1_Table2
    	when Colonne1_Table2=  SUBSTRING(Colonne1_Table1,7,2) then Colonne1_Table2
    	when Colonne1_Table2=  SUBSTRING(Colonne1_Table1,7,1) then Colonne1_Table2
    end=Nom_Dessin
    Ce que j'obtient est

    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
    Colonne1_Table1       Colonne2_Table1      Colonne1_Table2
     
    123456AA1                 123456A01             AA1
    123456AA1                 123456A01             AA
    123456AA1                 123456A01             A
    123456AA1                 123456A02             AA1
    123456AA1                 123456A02             AA
    123456AA1                 123456A02             A
    123456AA1                 123456A03             AA1
    123456AA1                 123456A03             AA
    123456AA1                 123456A03             A
    123456BB1                 123456B01             BB1
    123456BB1                 123456B01             BB
    123456BB1                 123456B01             B
    123456BB1                 123456B02             BB1
    123456BB1                 123456B02             BB
    123456BB1                 123456B02             B
    123456BB1                 123456B03             BB1
    123456BB1                 123456B03             BB
    123456BB1                 123456B03             B
    123456CC1                 123456C01             C
    123456CC1                 123456C02             C
    123456CC1                 123456C03             C

    Ce que je veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Colonne1_Table1       Colonne2_Table1      Colonne1_Table2
     
    123456AA1                 123456A01             AA1
    123456AA1                 123456A02             AA1
    123456AA1                 123456A03             AA1
    123456BB1                 123456B01             BB1
    123456BB1                 123456B02             BB1
    123456BB1                 123456B03             BB1
    123456CC1                 123456C01             C
    123456CC1                 123456C02             C
    123456CC1                 123456C03             C

    avec le ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON Nom_Dessin = SUBSTRING(Colonne1_Table1,7,20) OR Nom_Dessin = SUBSTRING(Colonne1_Table1,7,2) OR Nom_Dessin = SUBSTRING(Colonne1_Table1,7,1)
    même résultat

    Comment obtient-on ce que je veux.

    Merci!

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 698
    Points : 586
    Points
    586
    Par défaut
    J'ai pas le temps de taper la requête, mais avec 3 LEFT JOIN, un pour chaque "Case" ça va marcher... c'est un peu moche mais vous aurez une seule ligne de résultat pas cas.

    Ensuite avec quelques ISNULL vous aurez les 3 colonnes qui vous intéresse.

    A+

    Edit :

    C'est ça que je voulais dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Colonne1_Table1, Colonne2_Table1, COALESCE(T2_1.Colonne1_Table2,T2_2.Colonne1_Table2,T2_3.Colonne1_Table2) Colonne1_Table2
    FROM sad.dbo.sad_bmbom  AS T1
    left JOIN [IMP].[dbo].[New_Qte_Remorque] T2_1 on T2_1.Colonne1_Table2=  SUBSTRING(T1.Colonne1_Table1,7,20)
    left JOIN [IMP].[dbo].[New_Qte_Remorque] T2_2 on T2_2.Colonne1_Table2=  SUBSTRING(T1.Colonne1_Table1,7,2)
    left JOIN [IMP].[dbo].[New_Qte_Remorque] T2_3 on T2_3.Colonne1_Table2=  SUBSTRING(T1.Colonne1_Table1,7,1)

  5. #5
    Membre éprouvé
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Points : 1 116
    Points
    1 116
    Par défaut Résolu
    Merci beaucoup beaucoup Donpi.

    en plein ce que cherchait.

    N'étant pas expert en sql server je connaissait pas COALESCE.

    Je vois maintenant plein de possibilité dans mes futurs requêtes.

    Merci!

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Dans votre cas particulier, vous pouvez aussi faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT 
    	Colonne1_Table1, 
    	Colonne2_Table1, 
    	MAX(Colonne1_Table2) 
    FROM Table_1
    left JOIN Table_2 
    	on	Colonne1_Table2=  SUBSTRING(Colonne1_Table1,7,20) 
    	or  Colonne1_Table2=  SUBSTRING(Colonne1_Table1,7,2) 
    	or  Colonne1_Table2=  SUBSTRING(Colonne1_Table1,7,1) 
    GROUP BY 	
    	Colonne1_Table1, 
    	Colonne2_Table1

Discussions similaires

  1. LEFT JOIN ON plusieurs conditions
    Par comode dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/09/2011, 14h54
  2. Left join / limit avec condition
    Par AdSFR dans le forum Requêtes
    Réponses: 5
    Dernier message: 03/03/2010, 15h22
  3. [WD14] Requête LEFT join
    Par devdev dans le forum WinDev
    Réponses: 4
    Dernier message: 16/02/2010, 11h29
  4. Pb de requête LEFT JOIN
    Par ofostier dans le forum Requêtes
    Réponses: 5
    Dernier message: 24/06/2008, 10h03
  5. [Access2003]-Perte de données requête left join
    Par alcabk dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 11/10/2007, 11h45

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