Bonjour,
J'aurais besoin d'aide afin d'optimiser au mieux une requête extrayant des données sur une table de workflow où sont enregistrées les nouvelles valeurs.
PRINCIPES
====================
Les tables :
une table WF_TABLE (wf_table_id, wf_table_name, wf_table_valeur) enregistrant l'entité modifiée
- wf_table_id : correspond à mà modification
- wf_table_name correspond au nom de la table 'entité' modifiée
- wf_table_valeur correspond à l'Id de mon entité
une table WF_CHAMP (wf_champ_id, wf_champ_nom, wf_champ_valeur, wf_table_id) enregistrant le nom du champ et sa nouvelle valeur
J'ai donc pour chaque entité modifiée dans WF_TABLE, autant de lignes dans WF_CHAMP que de champs modifiés (chaque ligne stockant le nom de la colonne dans wf_champ_name et la nouvelle valeur dans wf_champ_valeur)
Je dois faire une extraction/tableau de afin de visualiser les nouvelles valeurs pour chaque entité modifiées avec une ligne par entités et autant de colonnes que de champs à afficher ds le tableau
(le nb de colonne du tableau n'est pas dynamique en fonction du nb de champ modifié, il est fixé dans la RQT, mais pourra éventuellement varier en fonction du besoin qui évolue et du nb de colonnes à visualiser)
Je précise que l'extraction que je dois faire se fait sur un type d'entité (le système de workflow étant générique à plusiuers entité dans ma base),
SOLUTIONS
===============================
Je vois 2 façons de le faire :
A/ MULTI JOINTURE : 1 jointure sur la table des champs pour chaque champ à visualiser
- celle sur laquelle j'irai en premier
- j'alias ma table wf_champ à chaque fois avec la condition wf_champ_name='nom_champ_voulu'
- mais bcp de jointure si je dois visualiser/remonter bcp de champs
B/ JOINTURE UNIQUE : 1 seule jointure sur la table des champs wf_champ
- une idée pour éviter d'écrire 50 jointures mais je sais pas si c'est pertinent
- dans mon select pour chaque colonne/champ que je veux remonter je fais if(wf_champ_name='nom_champ_voulu',wf_champ_valeur,null)
- mais du coup, ça me remonte pour chaque entité modifiée autant de lignes que de champ souhaités, pour chaque ligne seule le champ souhaité etant rempli, les autres à null
- du coup il faut agrégé , je pensais le faire via un max() sur chaque champ remonté
SQL A :
---------------------
SQL B :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT T.wf_table_name, T.wf_table_valeur, C1.wf_champ_valeur 'CHAMP1', C2.wf_champ_valeur 'CHAMP2', C3.wf_champ_valeur 'CHAMP3' -- etc ... autant de fois que de champ et de jointure from WF_TABLE T LEFT OUTER JOIN WF_CHAMP C1 on T.wf_table_id=C1.wf_table_id and C1.wf_champ_name='champ1' LEFT OUTER JOIN WF_CHAMP C2 on T.wf_table_id=C2.wf_table_id and C2.wf_champ_name='champ2' LEFT OUTER JOIN WF_CHAMP C3 on T.wf_table_id=C3.wf_table_id and C3.wf_champ_name='champ3' --- autant de jointure que de champs souhaités
---------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT T.wf_table_name, T.wf_table_valeur, MAX(IF(wf_champ_name='champ1',wf_champ_valeur,null)) 'CHAMP1' MAX(IF(wf_champ_name='champ2',wf_champ_valeur,null)) 'CHAMP2' MAX(IF(wf_champ_name='champ3',wf_champ_valeur,null)) 'CHAMP3' from WF_TABLE T LEFT OUTER JOIN WF_CHAMP CHAMPS on T.wf_table_id=CHAMPS.wf_table_id
Alors selon vous, je reste sur ma première idée de multi jointure ? ou la seconde solution est-elle meilleure ?
Qu'estce qui coûte le moins, qui est plus performant ?
- multi-jointure ramenant chacune une ligne ?
- ou mono jointure avec MAX et un IF sur chaque colone du select ?
Merci d'avance pour le conseil
Partager