mysql - 你不能在FROM子句中指定更新的目标表(我的查询有效,但不是等效更新)
问题描述:
我已经看到有关此特定错误消息的几个问题,但找不到与我的问题。mysql - 你不能在FROM子句中指定更新的目标表(我的查询有效,但不是等效更新)
只是我的问题的快速解释。
我有一张表,其中包含一些游戏的结果。
当有人缺席,我们存储这个人的前一个游戏,游戏结果的平均值,我们设置属性f_present为0
对于部分没有问题。
当我们修改一个古老的游戏,我要更新所有下面的比赛里有人缺席存储新值时发生的问题(该玩家的游戏,他不存在的新的平均值。)
我能够执行查询,但我无法执行更新,因为“您无法在FROM表中更新目标表”错误消息。
这里是我的查询(工作)
select t1.f_subgame_id,
t1.F_PLAYER_ID,
(SELECT avg(t2.f_result)
from t_subgames_results t2
join t_subgames t2s on t2s.f_subgame_id = t2.f_subgame_id
join t_seasons_games t2ss on t2ss.f_game_id = t2s.f_game_id
where F_RESULT > -1
and F_PLAYER_ID = t1.F_PLAYER_ID
and t2ss.F_SEASON_ID = t1ss.F_SEASON_ID
and t2ss.F_DATE < t1ss.F_DATE
)
from t_subgames_results t1
join t_subgames t1s on t1s.f_subgame_id = t1.f_subgame_id
join t_seasons_games t1ss on t1ss.f_game_id = t1s.f_game_id
where t1ss.f_date>'2012-09-07' and t1.F_PRESENT = 0;
这是我尝试更新:
update t_subgames_results t1
join t_subgames t1s on t1s.f_subgame_id = t1.f_subgame_id
join t_seasons_games t1ss on t1ss.f_game_id = t1s.f_game_id
set f_result =
(SELECT avg(t2.f_result) as result
from t_subgames_results t2
join t_subgames t2s on t2s.f_subgame_id = t2.f_subgame_id
join t_seasons_games t2ss on t2ss.f_game_id = t2s.f_game_id
where F_RESULT > -1
and F_PLAYER_ID = t1.F_PLAYER_ID
and t2ss.F_SEASON_ID = t1ss.F_SEASON_ID
and t2ss.F_DATE < t1ss.F_DATE
)
where t1ss.f_date>'2012-09-07' and t1.F_PRESENT = 0;
同样,我知道有一对夫妇对这个问题的话题,但似乎无法发现与我的问题有关...
再次感谢您的帮助!
答
我结束了这个,非常感谢!
create temporary table t_results_temp SELECT * from t_subgames_results;
update t_subgames_results t1
join t_subgames t1s on t1s.f_subgame_id = t1.f_subgame_id
join t_seasons_games t1ss on t1ss.f_game_id = t1s.f_game_id
set f_result =
(SELECT COALESCE(avg(t2.f_result),0) as result
from t_results_temp t2
join t_subgames t2s on t2s.f_subgame_id = t2.f_subgame_id
join t_seasons_games t2ss on t2ss.f_game_id = t2s.f_game_id
where t2.F_RESULT > -1
and F_PLAYER_ID = t1.F_PLAYER_ID
and t2ss.F_SEASON_ID = t1ss.F_SEASON_ID
and t2ss.F_DATE < t1ss.F_DATE
)
where t1ss.f_date>'2012-09-07' and t1.F_PRESENT = 0;
drop table t_results_temp;
你只是遇到了MySQL的限制。在类似的情况下,我倾向于使用CREATE TEMPORARY TABLE temptable SELECT',然后将“UPDATE”加入临时表而不是实际的表中。 –
lanzz
查询引擎无法弄清楚如何执行查询,它碰到了它自己,因此是愚蠢的消息。与其他DBMS一起也可以看到它。正如Ianzz所建议的,你需要通过分解来简化它。临时表将是一个好方法,或者重新考虑你的模式以使这更容易。 –
@TonyHopkinson:你在哪个DBMS上看到这种错误?我不认为有其他DBMS在这个愚蠢的限制。 –