Update:dit antwoord behandelt de algemene foutclassificatie. Voor een specifieker antwoord over hoe de exacte vraag van de OP het beste kan worden afgehandeld, zie andere antwoorden op deze vraag
In MySQL kunt u niet dezelfde tabel wijzigen die u in het SELECT-gedeelte gebruikt.
Dit gedrag is gedocumenteerd op:http://dev.mysql.com/doc/refman/5.6/en/update.html
Misschien kun je gewoon aan tafel voor zichzelf gaan
Als de logica eenvoudig genoeg is om de query opnieuw vorm te geven, verliest u de subquery en voegt u de tabel aan zichzelf toe, waarbij u de juiste selectiecriteria gebruikt. Hierdoor ziet MySQL de tabel als twee verschillende dingen, waardoor destructieve veranderingen kunnen plaatsvinden.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
U kunt ook proberen de subquery dieper in een from-clausule te nesten ...
Als je de subquery absoluut nodig hebt, is er een tijdelijke oplossing, maar deze is om verschillende redenen, waaronder prestaties, lelijk:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
De geneste subquery in de FROM-component creëert een impliciete tijdelijke tabel , dus het telt niet als dezelfde tabel die u bijwerkt.
... maar pas op voor de query-optimizer
Pas echter op dat van MySQL 5.7 .6
en verder kan de optimizer de subquery optimaliseren en u nog steeds de fout geven. Gelukkig is de optimizer_switch
variabele kan worden gebruikt om dit gedrag uit te schakelen; hoewel ik dit niet kan aanbevelen als iets meer dan een kortetermijnoplossing of voor kleine eenmalige taken.
SET optimizer_switch = 'derived_merge=off';
Met dank aan Peter V. Mørch voor dit advies in de reacties.
Voorbeeldtechniek was van Baron Schwartz, oorspronkelijk gepubliceerd op Nabble , hier geparafraseerd en uitgebreid.