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 :

Utilisation des Jointures Conditionnées


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Maroc

    Informations forums :
    Inscription : Mai 2007
    Messages : 138
    Par défaut Utilisation des Jointures Conditionnées
    Bonjour tout le monde.
    Mon souçis est que je veux utiliser des jointures entres des tables, mais sous certaines conditions.
    Je veux, si ca existe biensur, un bout de code sous SQL Server expliquant ou traduisant l'algorithme suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT x1, x2, x3, ...
    FROM T1 INNER JOIN T2 ON T1.champ = T2.champ     INNER JOIN 
    (
    SI test1 AND test2 then TTT1 ON TTT1.champ = T2.champ
    SINON                         TTT2 ON TTT2.champ = T2.champ
    )
    WHERE .....


    J'en ai vraiment trop besoin.

    Merci d'avance pour vos réponses

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Par défaut
    Ce n'est pas possible à faire en condition de jointure à ma connaissance.

    Tu vas devoir faire tes 2 jointures nécessaires et utilise un CASE dans le SELECT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT x1, x2, x3, CASE WHEN condition THEN TTT1.* WHEN condition THEN TTT2.*
    FROM T1 INNER JOIN T2 ON T1.champ = T2.champ INNER JOIN
    TTT1 ON TTT1.champ = T2.champ INNER JOIN TTT2 on TTT2.champ = T2.champ

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Maroc

    Informations forums :
    Inscription : Mai 2007
    Messages : 138
    Par défaut
    Merci bcp pour ta réponse.
    je l'essaye tout de suite et je te répond si ca marche ou pas.
    Merci encore une fois

    cordialement

  4. #4
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    Je pense qu'avec la version de Keihilin, tu risque de perdre des lignes. Par exemple, si une ligne T1 a une correspondance dans TTT1 (dont tu as besoin) mais pas dans TTT2 (dont tu n'as pas besoin), avec le inner join, tu vas faire sauter cette ligne. Il est donc possible qu'il te faille des left outer join à la place.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT x1, x2, x3, CASE WHEN condition1 THEN TTT1.* WHEN condition2 THEN TTT2.*
    FROM T1 
    INNER JOIN T2 ON T1.champ = T2.champ 
    LEFT OUTER JOIN TTT1 ON TTT1.champ = T2.champ 
    LEFT OUTER JOIN TTT2 ON TTT2.champ = T2.champ
    where (condition1 and TTT1.champ is not nul) or (condition2 and TT2.champ is not null) -- pour avoir les même lignes en résultat
    Par contre, en terme de perf, ça va pas être léger. Celà étant, il faut regarder les relations entre tes lignes, peut-être que l'INNER JOIN suffit (ou bien un seul left outer join)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Maroc

    Informations forums :
    Inscription : Mai 2007
    Messages : 138
    Par défaut
    MERCI POUR VOS RéPONSES AVANT TOUT;
    Pour le solution de Keihilin, je l'ai essayé mais ca marche pas.
    j'ai essayé d'ajouter une variable et c'est cette valeur que je vais prendre dans mon select.
    Cette variable je l'initialise avant le select par le case. Le problème est qu'il ne reconnait pas la table sur laquelle je fais mon case.

    Je vais essayer d'appliquer la solution de Monstros Velu et je vous tiens au courant.

    Merci tout de même de vos réponses

    Cordialement

  6. #6
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    C'est la même solution, y a que le type de jointure qui change...


    Si tu nous disais plus précisement le problème ? Avec du code, par exemple ? ;o)

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/03/2010, 19h05
  2. Utiliser uniquement des jointures ou requetes simple
    Par cobra91310 dans le forum Développement
    Réponses: 14
    Dernier message: 28/11/2008, 16h17
  3. Utiliser des ALIAS de colonnes dans une jointure
    Par mbzhackers dans le forum SQL
    Réponses: 4
    Dernier message: 31/03/2008, 10h27
  4. requête utilisant les jointures et des UDT
    Par dingoth dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 25/04/2006, 16h22
  5. Peut on utiliser OR avec des jointures de tables??
    Par gins06 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/10/2005, 12h40

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