P粉2371257002023-08-28 13:59:47
您可以通过三个步骤完成此操作:
CREATE TABLE test2 AS SELECT PersId FROM pers p WHERE ( chefID IS NOT NULL OR gehalt < ( SELECT MAX ( gehalt * 1.05 ) FROM pers MA WHERE MA.chefID = p.chefID ) )
...
UPDATE pers P SET P.gehalt = P.gehalt * 1.05 WHERE PersId IN ( SELECT PersId FROM test2 ) DROP TABLE test2;
或
UPDATE Pers P, ( SELECT PersId FROM pers p WHERE ( chefID IS NOT NULL OR gehalt < ( SELECT MAX ( gehalt * 1.05 ) FROM pers MA WHERE MA.chefID = p.chefID ) ) ) t SET P.gehalt = P.gehalt * 1.05 WHERE p.PersId = t.PersId
P粉4818158972023-08-28 13:51:38
问题在于,无论出于何种愚蠢的原因,MySQL 不允许您编写如下查询:
UPDATE myTable SET myTable.A = ( SELECT B FROM myTable INNER JOIN ... )
也就是说,如果您要对表执行 UPDATE
/INSERT
/DELETE
操作,则无法在内部查询(但是您可以引用外部表中的字段...)
解决方案是将子查询中的myTable
实例替换为(SELECT * FROM myTable)
,如下所示
UPDATE myTable SET myTable.A = ( SELECT B FROM (SELECT * FROM myTable) AS something INNER JOIN ... )
这显然会导致必要的字段被隐式复制到临时表中,因此这是允许的。
我找到了这个解决方案这里。该文章的注释: