2012-09-15 22 views
3

我已经看到有关此特定错误消息的几个问题,但找不到与我的问题。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; 

同样,我知道有一对夫妇对这个问题的话题,但似乎无法发现与我的问题有关...

再次感谢您的帮助!

+3

你只是遇到了MySQL的限制。在类似的情况下,我倾向于使用CREATE TEMPORARY TABLE temptable SELECT ',然后将“UPDATE”加入临时表而不是实际的表中。 – lanzz

+0

查询引擎无法弄清楚如何执行查询,它碰到了它自己,因此是愚蠢的消息。与其他DBMS一起也可以看到它。正如Ianzz所建议的,你需要通过分解来简化它。临时表将是一个好方法,或者重新考虑你的模式以使这更容易。 –

+0

@TonyHopkinson:你在哪个DBMS上看到这种错误?我不认为有其他DBMS在这个愚蠢的限制。 –

回答

3

我结束了这个,非常感谢!

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; 
相关问题