mysql - 您不能在 FROM 子句中指定要更新的目标表(我的查询有效,但不是等效更新)

Posted

技术标签:

【中文标题】mysql - 您不能在 FROM 子句中指定要更新的目标表(我的查询有效,但不是等效更新)【英文标题】:mysql - You can't specify target table for update in FROM clause (My query works but not the equivalent update) 【发布时间】:2012-09-08 16:31:07 【问题描述】:

我已经看到了一些关于此特定错误消息的问题,但找不到与我的问题匹配的任何问题。

简单解释一下我的问题。

我有一个表格,其中包含一些游戏的结果。

当有人缺席时,我们将这个人在之前游戏中的平均值存储为游戏结果,并将属性 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 &lt;your select here&gt;,然后将UPDATE 加入到该临时表而不是实际表中。 查询引擎无法弄清楚如何执行查询,它撞到了自己,因此出现了愚蠢的消息。在其他 DBMS 中也看到了它。正如 Ianzz 建议的那样,您需要通过分解来简化它。临时表是不错的选择,或者重新考虑您的架构以使其更容易。 @TonyHopkinson:您在其他哪个 DBMS 上看到过这种错误?我认为没有其他 DBMS 存在这种愚蠢的限制。 怀疑这是完全相同的问题,但我之前设法混淆了 SQL Server 和 Sybase。又或许是我糊涂了。 :p 老实说,我不会再写这样的查询了,而是使用临时表或 CTE,所以我可以理解,别管 DBMS。 【参考方案1】:

我终于搞定了,非常感谢!

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 - 您不能在 FROM 子句中指定要更新的目标表(我的查询有效,但不是等效更新)的主要内容,如果未能解决你的问题,请参考以下文章

您不能在 FROM 子句中指定要更新的目标表

mysql - 您不能在 FROM 子句中指定要更新的目标表(我的查询有效,但不是等效更新)

ERROR 1093 (HY000): 您不能在 FROM 子句中指定要更新的目标表

#1093 - 您不能在 FROM 子句中指定要更新的目标表 [重复]

sql mysql错误您无法在FROM子句中指定要更新的目标表

Mysql 错误:1093 - 无法在 FROM 子句中指定要更新的目标表