私は約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
まあどのように私はその問題をsloveすることができます更新しながら、私は、行自体にアクセスすることができないようですか?
多分テンポラリテーブルを持っているかもしれませんが、少しオーバーヘッドのようですが、関連のないすべての行もコピーする必要があります。
私はまた、this answerで説明されているように、instatを使用しようとしましたが、選択した行を制限する必要があります。私は音がinteresstingた
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