Bonjour,
j'ai un soucis avec une requête de mise à jour d'un champ avec une sous-requête
voici le schéma succinct de mes tables (j'ai omis les champs inutiles pour la requête)
orders: id, user_id
order_prestation : order_id, qty
prestation: id, number
event_session: user_id, prestation_id, total
Un bug dans mon appli a fait que le champ total de la table event_session a été modifié avec une mauvaise valeur sur certaines entrées
il doit prendre la valeur event_session.total = (prestation.number * order_prestation.qty)
J'ai créer une requête pour vérifier combien d'entrés on subit le bug:
Je voulais les corriger manuellement pensant qu'il n'y en avait pas beaucoup, mais en fait j'ai 60 bdd à mettre à jour j'ai regarder 5 bdd dans 2 j'ai pas d'erreur, les trois autres j'ai 27, 150, et plus de 300 entrées à modifier...
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 SELECT orders.id as facture_id, orders.ref as facture_ref, event_session.id as event_session_id, order_prestation.id as order_prestation_id, event_session.user_id as userid, event_session.prestation_id as presta_id, order_prestation.prestation_id as order_prestation_prestation_id, event_session.total as total_a_corriger, (prestation.number * order_prestation.qty) as total_ok FROM order_prestation JOIN orders ON orders.id = order_prestation.order_id JOIN event_session ON order_prestation.prestation_id = event_session.prestation_id JOIN prestation ON prestation.id = order_prestation.prestation_id WHERE event_session.total != (prestation.number * order_prestation.qty) AND order_prestation.prestation_id = event_session.prestation_id AND event_session.user_id = orders.user_id
J'ai donc opté pour une maj auto avec un requête :
Mais évidemment ça ne passe pas : `You can't specify target table 'event_session' for update in FROM clause`
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 UPDATE event_session SET event_session.total = ( SELECT (prestation.number * order_prestation.qty) as total_ok FROM order_prestation JOIN orders ON orders.id = order_prestation.order_id JOIN event_session ON order_prestation.prestation_id = event_session.prestation_id JOIN prestation ON prestation.id = order_prestation.prestation_id WHERE event_session.total != (prestation.number * order_prestation.qty) AND order_prestation.prestation_id = event_session.prestation_id AND event_session.user_id = orders.user_id )
Je sèche!
Si quelqu'un a une idée je suis preneur.
Merci
Partager