2012-09-15 25 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; 
相關問題