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 :

Problème LEFT JOIN après passage d'Access vers MySQL [MySQL-5.1]


Sujet :

Requêtes MySQL

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut Problème LEFT JOIN après passage d'Access vers MySQL
    Bonjour,

    je transfert une base de données d'Access 2010 vers MySQL 5.1.38.
    Une requête ne donne pas les mêmes résultats sur les LEFT JOIN table_og et table_aff. J'obtiens 55 lignes en MySQL contre 537 en Access.
    Les conditions en rouge semblent "bloquer" le LEFT JOIN mais je n'arrive pas à corriger cela.

    Remarques :
    1. '079' est en fait un paramètre (ce qui explique les concat) ;
    2. les données sont les mêmes sur Access que sur MySQL.
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    SELECT DISTINCT table_emp.Employe_CodeEmploye, table_emp.Employe_Nom, table_emp.Employe_Prenom, 
    table_emp.Employe_Statut, table_user.User_Login, aff_role_concatene.Roles, 
    resultat_all.UNI_UF, resultat_all.UNI_UG, resultat_all.UNI_LIBELLE
    FROM (((((resultat_all RIGHT JOIN table_emp ON resultat_all.EMP_MATRICULE_COURT = table_emp.Employe_CodeEmploye) 
    	LEFT JOIN table_aff ON table_emp.Employe_IDOrbis = table_aff.Employe_IDOrbis) 
    	LEFT JOIN table_user ON table_emp.Employe_IDOrbis = table_user.Employe_IDOrbis) 
    	LEFT JOIN aff_role_concatene ON table_user.User_IDOrbis = aff_role_concatene.User_IDOrbis) 
    	LEFT JOIN table_og ON table_emp.Employe_IDOrbis = table_og.Employe_IDOrbis) 
    	LEFT JOIN table_gh ON table_emp.Employe_CodeEmploye = table_gh.EMP_MATRICULE_COURT
    WHERE 
    (
    	(	table_emp.Employe_CodeEmploye Not Like concat('G', right('079', 2), 'I___') And 
    		table_emp.Employe_CodeEmploye Not Like concat('G', right('079', 2), 'A___') And 
    		table_emp.Employe_CodeEmploye Not Like 'ADMIN%' And 
    		table_emp.Employe_CodeEmploye Not Like '%TEST%' And 
    		table_emp.Employe_CodeEmploye <> '0' And 
    		table_emp.Employe_CodeEmploye Not Like 'ATI%' And 
    		table_emp.Employe_CodeEmploye <> 'QUADRAT' And 
    		table_emp.Employe_CodeEmploye <> 'AGFA'
    	) AND 
    	(table_emp.Employe_Fin Is Null Or table_emp.Employe_Fin > Now()) AND 
    	(table_user.User_Fin Is Null Or table_user.User_Fin > Now()) AND 
    	table_og.AffGroup_NomCourt Like concat('%', '079', '%') AND 
    	table_gh.EMP_MATRICULE_COURT Is Null
    ) OR 
    (
    	(	table_emp.Employe_CodeEmploye Not Like concat('G', right('079', 2), 'I___') And 
    		table_emp.Employe_CodeEmploye Not Like concat('G', right('079', 2), 'A___') And 
    		table_emp.Employe_CodeEmploye Not Like 'ADMIN%' And 
    		table_emp.Employe_CodeEmploye Not Like '%TEST%' And 
    		table_emp.Employe_CodeEmploye <>'0' And 
    		table_emp.Employe_CodeEmploye Not Like 'ATI%' And 
    		table_emp.Employe_CodeEmploye <> 'QUADRAT' And 
    		table_emp.Employe_CodeEmploye <> 'AGFA'
    	) AND 
    	(table_emp.Employe_Fin Is Null Or table_emp.Employe_Fin > Now()) AND 
    	(table_user.User_Fin Is Null Or table_user.User_Fin > Now()) AND 
    	table_gh.EMP_MATRICULE_COURT Is Null AND 
    	table_aff.AffStruct_NomCourt Like concat('079', '%') AND 
    	(table_aff.AffStruct_Fin Is Null Or table_aff.AffStruct_Fin > Now())
    )
    ORDER BY table_emp.Employe_CodeEmploye;
    La requête Access est identique à celle de MySQL (à la syntaxe près). J'ai enlevé les crochets et parenthèses inutiles pour plus de clarté :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    SELECT DISTINCT table_emp.Employe_CodeEmploye, table_emp.Employe_Nom, table_emp.Employe_Prenom, 
    table_emp.Employe_Statut, table_user.User_Login, aff_role_concatene.Roles, 
    resultat_all.UNI_UF, resultat_all.UNI_UG, resultat_all.UNI_LIBELLE
    FROM (((((resultat_all RIGHT JOIN table_emp ON resultat_all.EMP_MATRICULE_COURT = table_emp.Employe_CodeEmploye) 
    	LEFT JOIN table_aff ON table_emp.Employe_IDOrbis = table_aff.Employe_IDOrbis) 
    	LEFT JOIN table_user ON table_emp.Employe_IDOrbis = table_user.Employe_IDOrbis) 
    	LEFT JOIN aff_role_concatene ON table_user.User_IDOrbis = aff_role_concatene.User_IDOrbis) 
    	LEFT JOIN table_og ON table_emp.Employe_IDOrbis = table_og.Employe_IDOrbis) 
    	LEFT JOIN table_gh ON table_emp.Employe_CodeEmploye = table_gh.EMP_MATRICULE_COURT
    WHERE 
    (
    	(	table_emp.Employe_CodeEmploye Not Like "G79I???" And 
    		table_emp.Employe_CodeEmploye Not Like "G79A???" And 
    		table_emp.Employe_CodeEmploye Not Like "ADMIN*" And 
    		table_emp.Employe_CodeEmploye Not Like "*TEST*" And 
    		table_emp.Employe_CodeEmploye<>"0" And 
    		table_emp.Employe_CodeEmploye Not Like "ATI*" And 
    		table_emp.Employe_CodeEmploye Not Like "QUADRAT" And 
    		table_emp.Employe_CodeEmploye Not Like "AGFA"
    	) AND 
    	(table_emp.Employe_Fin Is Null Or table_emp.Employe_Fin>Now()) AND 
    	(table_user.User_Fin Is Null Or table_user.User_Fin>Now()) AND 
    	(table_og.AffGroup_NomCourt Like "*079*") AND 
    	(table_gh.EMP_MATRICULE_COURT Is Null)
    ) OR 
    (
    	(	table_emp.Employe_CodeEmploye Not Like "G79I???" And 
    		table_emp.Employe_CodeEmploye Not Like "G79A???" And 
    		table_emp.Employe_CodeEmploye Not Like "ADMIN*" And 
    		table_emp.Employe_CodeEmploye Not Like "*TEST*" And 
    		table_emp.Employe_CodeEmploye<>"0" And 
    		table_emp.Employe_CodeEmploye Not Like "ATI*" And 
    		table_emp.Employe_CodeEmploye Not Like "QUADRAT" And 
    		table_emp.Employe_CodeEmploye Not Like "AGFA"
    	) AND 
    	(table_emp.Employe_Fin Is Null Or table_emp.Employe_Fin>Now()) AND 
    	(table_user.User_Fin Is Null Or table_user.User_Fin>Now()) AND 
    	(table_gh.EMP_MATRICULE_COURT Is Null) AND 
    	(table_aff.AffStruct_NomCourt Like "079*") AND 
    	(table_aff.AffStruct_Fin Is Null Or table_aff.AffStruct_Fin>Now())
    )
    ORDER BY table_emp.Employe_CodeEmploye;
    Christophe

    Pensez à mettre quand c'est le cas.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    La requête qui a été exécutée dans Access n'est pas bonne ! Il y a 014 au lieu de 079... 4 jours de perdus !
    Christophe

    Pensez à mettre quand c'est le cas.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Je ne sais pas quel est le besoin fonctionnel pour votre requete, mais une chose est certaine, si vos tables contiennent autre chose que quelques lignes, les temps de réponse vont être catastrophiques, vous combinez que des prédicats like '%....%' avec des prédicats <> des OR et des fonctions de colonne.
    Bref tout ce qu'il y a de pire pour les perfs.

    De plus, la requête est difficile à lire, et donc à maintenir, il y a probablement des différences entre les 2 requêtes que vous ne voyez pas vu pour cette raison.

    Il y a très certainement moyen de procéder autrement, quitte à utiliser des tables temporaires et passer par plusieurs étapes.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    Je suis tout à fait d'accord sur la qualité de la requête mais comme on m'a alloué 10 minutes par requête (et que je viens d'exploser le budget pour celle-ci), je ne modifie que le minimum.
    Christophe

    Pensez à mettre quand c'est le cas.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Christophe P. Voir le message
    Je suis tout à fait d'accord sur la qualité de la requête mais comme on m'a alloué 10 minutes par requête (et que je viens d'exploser le budget pour celle-ci), je ne modifie que le minimum.
    Je comprends et je compatis

    Ceci signifie que vos donneurs d'ordre n'ont malheureusement pas compris que ce faisant, ce qu'ils croient économiser en vous allouant quelques minutes pour corriger une requête, leur coutera moultes fois plus en bugs (liés à l'incompréhension de la requete et dysfonctionnements que cela entraine en conséquence), en cout CPU, en gène pour les autres traitements qui attendent que votre requete se termine etc...
    Bref une courte vue, classique, mais navrante

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

Discussions similaires

  1. [11g] Problème de passage de Access vers Oracle
    Par purity dans le forum Administration
    Réponses: 1
    Dernier message: 05/08/2013, 14h06
  2. [WD15] Problème LEFT JOIN
    Par SevenSoftware dans le forum WinDev
    Réponses: 19
    Dernier message: 27/06/2010, 08h03
  3. Problème LEFT JOIN avec conditions ?
    Par Zane dans le forum Requêtes
    Réponses: 8
    Dernier message: 05/03/2010, 16h29
  4. Problème de traductions après passage a gtkbuilder
    Par moimael dans le forum GTK+ avec Python
    Réponses: 3
    Dernier message: 22/11/2009, 16h37
  5. problème "left join fetch" recup de données associées
    Par ddv_again dans le forum Hibernate
    Réponses: 2
    Dernier message: 19/12/2006, 17h29

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