2012-09-15 2 views
3

이 특정 오류 메시지에 대한 몇 가지 질문을 보았지만 일치하는 항목을 찾을 수 없습니다. 문제.mysql - FROM 절에서 업데이트 할 대상 테이블을 지정할 수 없습니다 (내 쿼리는 작동하지만 동등한 업데이트는 수행하지 않습니다)

내 문제에 대한 간단한 설명.

일부 게임에 대한 결과가 포함 된 표가 있습니다. 사람이없는 경우

, 우리는 게임의 결과로 이전의 게임이 사람의 평균을 저장하고 우리는 그 부분에 아무 문제를 들어 0

의 속성 f_present을 설정합니다.

문제는 우리가 오래된 게임을 수정할 때, 나는 누군가가 새 값을 저장할 수없는 모든 다음 게임 업데이트 할 필요가 발생한다 (그는 결석 게임에 대한 그 플레이어의 새 평균.)

I '쿼리를 수행 할 수 있지만 "FROM 테이블에서 업데이트 할 대상 테이블을 지정할 수 없습니다."라는 오류 메시지로 인해 업데이트를 수행 할 수 없습니다.

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; 

을 나는 거기에이 문제에 대한 주제의 몇하지만 수없는 것 알고, 다시 :

여기가 (작동) 내 쿼리

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; 

여기에 업데이트하는 나의 시도가있어입니다 그게 내 문제와 관련이 있는지 찾아야 ...

나를 도와 주셔서 다시 한번 감사드립니다!

+3

방금 ​​MySQL의 한계가 있습니다. 유사한 상황에서 저는'CREATE TEMPORARY TABLE 유혹 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;