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;
同樣,我知道有一對夫婦對這個問題的話題,但似乎無法發現與我的問題有關...
再次感謝您的幫助!
你只是遇到了MySQL的限制。在類似的情況下,我傾向於使用CREATE TEMPORARY TABLE temptable SELECT',然後將「UPDATE」加入臨時表而不是實際的表中。 –
lanzz
查詢引擎無法弄清楚如何執行查詢,它碰到了它自己,因此是愚蠢的消息。與其他DBMS一起也可以看到它。正如Ianzz所建議的,你需要通過分解來簡化它。臨時表將是一個好方法,或者重新考慮你的模式以使這更容易。 –
@TonyHopkinson:你在哪個DBMS上看到這種錯誤?我不認爲有其他DBMS在這個愚蠢的限制。 –