약 4000 개의 오류가있는 버그가있는 약 7000 개의 행이있는 테이블이 있습니다. 위치는 'null'
이 아니고NULL
이되어야합니다. 이제 가능한 거의 모든 행에 대한 데이터를 수정하려고합니다.하위 쿼리에서 자체 참조로 행 업데이트
UPDATE `timelog` t
SET `location`=(SELECT location
FROM timelog tl
WHERE tl.end_ts=t.end_ts AND location != 'null'
ORDER BY tl.log_id DESC
LIMIT 0,1) -- Just to make sure that I get 1 or 0 results
WHERE end_ts > '2012-01-01 00:00:00' AND location = 'null';
하지만 오류 얻을 :
#1093 - You can't specify target table 't' for update in FROM clause
글쎄 내가 그 문제를 풀기가 할 수있는 방법 나는 업데이트하는 동안 행 자체에 액세스 할 수 있다는 것입니까?
어쩌면 임시 테이블과 함께,하지만 그게 너무 관련이없는 모든 행을 복사 관리 할 수있는 약간의 오버 헤드가 될 것 같습니다.
나는 또한 this answer에서 설명 된 것처럼 instat을 사용하려고 시도했지만 선택한 행을 제한해야합니다. 나는 임시 볼 수있는 내 자신의 솔루션을 시도 답변을 바탕으로
는 :
CREATE OR REPLACE VIEW right_locations AS
SELECT l.*, t.end_ts, t.location, (SELECT location FROM timelog tl WHERE tl.end_ts=t.end_ts AND location != 'null' ORDER BY tl.log_id DESC LIMIT 0,1) AS "possible", t.end_location
FROM `log` l
JOIN timelog t ON t.log_id=l.log_id
WHERE l.action_id =7 AND l.ts > '2012-01-01 00:00:00'
ORDER BY end_location;
UPDATE timelog t
JOIN right_locations r ON r.log_id=t.log_id
SET t.location = r.possible
WHERE t.end_ts > '2012-01-01 00:00:00' AND t.location = 'null';
왜 곧장 앞으로 가기 조인 대신보기를 사용하고 있습니까? – nnichols
가입 시도가 작동하지 않았습니다. 내 Triest 작업 솔루션은 위에 있습니다. – rekire
최대 값을 얻기 위해 왼쪽 조인을 사용하여 내 솔루션을 사용해 보셨습니까? 뷰와 함께 사용하는 버전과 정확히 동일한 결과를 생성해야합니까? – nnichols