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

Requêtes MySQL Discussion :

Jointure conditionnelle


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 199
    Par défaut Jointure conditionnelle
    Bonjour à tous,
    J'ai une requette dans laquelle je fais une clause WHERE conditionnelle. Ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT table1.*, table2.* 
    FROM table1, table2
    WHERE 
    CASE WHEN (table1.champ1 is NULL OR table1.champ1 = 0) 
    THEN table1.champ2=table2.champ2 ELSE table1.champ1=table2.champ1
    END
    En gros, la jointure se fait sur le champ2 si le champ1 de la table1 est nul (null ou 0) et sinon sur le champ1.

    Cette requête prend beaucoup trop de temps à s'éxécuter : 11 s au lieu de 0,1 si j'enlève cette clause.
    Alors quelqu'un peut-il m'aider et me dire comment faire ce genre de jointure ou comment l'optimiser ?

    Merci par avance.

    Julie

  2. #2
    Membre Expert
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Par défaut
    Bonjour,

    Quelle est la version de MySQL utilisée et la volumétrie des tables ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 199
    Par défaut
    Merci pour ta réponse et ton intérêt.

    La table table1 fait environ 5000 lignes et la table2 environ 800. Et j'utilise mysql 4.0.16.

    Mais à vrai dire je pense avoir résolu mon problème. En fait, ma requête était mal posée. Il s'agit en fait de la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT table1.*, table2.* 
    FROM table1, table2 
    WHERE 
    CASE WHEN (table1.champ1 is NULL OR table1.champ1 = 0) 
    THEN table1.champ2=table2.champ2 ELSE table1.champ1=table2.champ2 
    END
    et donc je l'ai modifiée de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT table1.*, table2.* 
    FROM table1, table2 
    WHERE 
    table2.champ2 = CASE WHEN (table1.champ1 is NULL OR table1.champ1 = 0) THEN table1.champ2 ELSE table1.champ1 END
    Et le temps d'éxécution passe de 11s à 0.16s !
    En espérant que ça pourra un jour aider quelqu'un...
    Julie

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Et avec une UNION de 2 SELECT, ça donne quoi? Meilleur ou moins bon? C'est juste par curiosité (tant qu'à faire, autant explorer le problème jusqu'au bout !)
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 199
    Par défaut
    Je pense qu'une union de 2 select ne me donnera pas le même résultat. Finalement, je ne fais qu'une seule jointure dépendant d'une condition alors que l'union me donnera 2 fois trop de résultats, non ?
    Quelle est la requête que tu suggères ?

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    J'avais pensé à un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    (SELECT table1.*, table2.*
    FROM table1, table2
    WHERE table2.champ2=table1.champ1
     
    ) UNION (
    SELECT table1.*, table2.*
    FROM table1, table2
    WHERE (table1.champ1 is NULL OR table1.champ1 = 0)
    AND table2.champ2=table1.champ2
     
    )
    ORDER BY table1.id
    Je suis d'accord, les deux requêtes ne sont pas strictement équivalentes dans le sens où l'ordre des enregistrements retournés n'est pas le même, c'est pour cela que j'ai pensé à ajouter la clause ORDER BY (ce qui malheureusement devrait nuire aux perfs). L'ordre a-t-il une importance pour toi?

    Je posais cette question juste par curiosité, afin d'en apprendre un peu plus (niveau faisabilité, perfs, etc.). Je suis curieux de nature !
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  7. #7
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Sinon, on peut aussi considérer ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT table1.*, table2.* 
    FROM table1, table2 
     
    WHERE table2.champ2=table1.champ1
    OR (table2.champ2=table1.champ2 AND (table1.champ1 is NULL OR table1.champ1 = 0))
    Si table1.champ1 est NULL ou =0, alors il ne peut être égal à table2.champ2 (en admettant que table2.champ2 ne puisse être NULL ou =0), dans ce cas c'est table2.champ2=table1.champ2 qui est évalué.

    Est-ce que tu pourrais être un peu plus précise sur les valeurs que peuvent prendre table{1|2}.champ{1|2} (si ils peuvent être NULL ou prendre la valeur 0), stp ?

    Par ailleurs, il doit être possible de simplifier l'expression:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (table1.champ1 is NULL OR table1.champ1 = 0)
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

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

Discussions similaires

  1. problème sur jointure conditionnelle
    Par dahno_fr dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 15/10/2009, 16h38
  2. Requete avec jointure conditionnelle
    Par grunk dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/08/2009, 16h00
  3. Jointure conditionnele sur plusieurs tables
    Par Clorish dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 20/12/2007, 14h20
  4. pb requete avec jointure ( conditionnelle !?!)
    Par raspout81 dans le forum Requêtes
    Réponses: 5
    Dernier message: 12/07/2007, 21h33
  5. Jointure conditionnelle ?
    Par mattyeux dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/04/2007, 10h10

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