Bonjour,
J'ai une requête qui update un champ d'une table à partir d'un select. La requête est légèrement complexe puisque j'ai deux tables impliquées:
- la table à updater tableA
- la table tableB, liée à A par une clef
- la table tableB (encore) liée à elle même par une autre clef
L'idée est qu'une ligne de tableA est liée à une ligne de tableB, mais l'inverse n'est pas vrai. En pratique on a toujours deux lignes de B pour une ligne de A, avec une seule directement liée. (Je n'ai pas choisi cette structure :s).Le champ de la tableA à updater doit prendre la valeur de la ligne de B qui correspond à la ligne de B liée à la ligne de A et qui n'est pas lié à A. (ouf!)
ligneA correspond directement (FK) à ligneB1 et à travers ligneB1 à ligneB2.
L’identification se fait par un champ qui a la même valeur pour ligneB1 et ligneB2. Les deux lignes ne sont par contre pas identiques puisque seule ligneB1 est liée à ligneA.
Mon problème est le suivant: j'update tableA grâce à:
Cela fonctionne mais l'update passe sur toutes les lignes (même s'il ne modifie que les bonnes) et les performances sont donc moyennes. Une solution semble être d'ajouter une condition where après le set en répétant la requête, mais ça n'est pas très élégant. Je pense qu'on peut aussi faire passer l'update sur un select limitant le nombre de lignes de tableA, mais ça reste ennuyeux de répéter deux fois la même requête.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 UPDATE tableA SET champAUpdater = ( SELECT tableB2.champ FROM [...] WHERE tableA.clef = tableB1.clef )
Si je n'ai pas trop mal exposé le problème, existe-t’il une solution qui permette d'updater directement les bonnes lignes de manière performante?
Partager