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

Langage SQL Discussion :

Utiliser un INNER JOIN ou un autre INNER JOIN selon un critère


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 111
    Points : 44
    Points
    44
    Par défaut Utiliser un INNER JOIN ou un autre INNER JOIN selon un critère
    Bonjour,

    J'ai une requête dans laquelle je dois récupérer le nom du client :
    - dans la table client1 avant le 1er juillet
    - dans la table client2 après le 1er juillet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select f.id_facture, c.nom
    from facture f
      inner join client1 c on
        c.id_client = f.id_facture and
        c.date < '20140701'
      inner join client2 c on
        c.id_client = f.id_facture and
        '20140701' <= c.date
    Le SQL précédent ne fonctionne évidemment pas, mais c'est exprès pour montrer que je souhaite qu'il exécute seulement la partie client1 ou la partie client2 suivant la date.

    De plus, il s'agit d'un exemple, mon cas concret est une énorme requête dans des tables volumineuses, donc les performances sont importantes.
    Merci à vous !

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 040
    Points : 23 795
    Points
    23 795
    Par défaut
    Bonjour,

    Peut-être comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT f.id_facture, c.nom
    FROM facture f
    INNER JOIN (
    	SELECT c1.id_client, c1.nom
    	FROM client1
    	WHERE c1.date < '20140701'
    	UNION
    	SELECT c2.id_client, c2.nom
    	FROM client2
    	WHERE c2.date >= '20140701'
    ) c ON f.id_facture = c.id_client
    Au passage, dans votre 2ème jointure, l'inégalité n'est pas dans le bon sens : c'est ">=" et pas "<="

  3. #3
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    Bonjour,

    en terme de performance, ne serait-il pas plus intéressant de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT f.id_facture, c.nom
    FROM facture f
    INNER JOIN client1 c ON f.id_facture = c.id_client
    WHERE c.date < '20140701'
    UNION ALL
    SELECT f.id_facture, c.nom
    FROM facture f
    INNER JOIN client2 c ON f.id_facture = c.id_client
    WHERE c.date >= '20140701'
    ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 763
    Points : 576
    Points
    576
    Par défaut CASE ...WHEN ... THEN
    Bonjour à tous,

    Cette requête ne pourrait-elle pas être résolue avec un CASE ... WHEN ... THEN ?

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 040
    Points : 23 795
    Points
    23 795
    Par défaut
    A priori, le CASE n'est pas possible, dans la mesure où la condition porte sur la table à joindre.

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 040
    Points : 23 795
    Points
    23 795
    Par défaut
    Ou alors, 2 jointures externes et un COALESCE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT f.id_facture, COALESCE(c1.nom, c2.nom) AS nom
    FROM facture f
    LEFT JOIN client1 c1 ON f.id_facture = c1.id_client AND c1.date < '20140701'
    LEFT JOIN client2 c2 ON f.id_facture = c2.id_client AND c2.date >= '20140701'

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 922
    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 : 21 922
    Points : 51 715
    Points
    51 715
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par ced Voir le message
    A priori, le CASE n'est pas possible, dans la mesure où la condition porte sur la table à joindre.
    Si, bien sûr !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM    facture AS T
            CROSS JOIN client1 AS T1
            JOIN client2 AS T2 
                 ON  1 = CASE WHEN T.C = T1.C THEN 1
                              WHEN T.C = T2.C THEN 1 END
    A +

Discussions similaires

  1. "Outer join" plus rapide que "inner join"
    Par dwinkel dans le forum SQL
    Réponses: 5
    Dernier message: 14/01/2009, 11h25
  2. [VB.NET] Utilisation d'une variable dans une autre form (!)
    Par neuropathie dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/12/2005, 14h09
  3. utiliser base de donné d'1 autre site
    Par hm19000 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 15/11/2005, 14h40
  4. Réponses: 4
    Dernier message: 13/10/2005, 13h41
  5. utilisation d'une fiche d'un autre projet
    Par dolphins dans le forum EDI
    Réponses: 1
    Dernier message: 22/07/2005, 10h01

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