У меня есть таблица с около 7000 строк, где около 4000 имеют ошибку, вызванную ошибкой.(Местоположение '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 - Вы не можете указать целевую таблицу 't' для обновления в предложении FROM
Что ж, похоже, я не могу получить доступ ксама строка при обновлении, как я могу решить эту проблему?
Может быть, с временной таблицей, но это, кажется, немного накладные расходы, и мне приходится копировать все несвязанные строки тоже.
Iтакже пытался использовать 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';