1

ここで、A はデータベース、B は A のテーブル、C、D、E、F はテーブル B の列です。

UPDATE AB SET C = (SELECT SUM(D) FROM AB t2 WHERE t2.E=ABE AND t2.F=2013 GROUP BY E) WHERE F=2013;

これは Oracle PL/SQL では正常に機能しますが、MySQL では次のエラーが発生します。

エラー コード: 1093。FROM 句 0.000 秒で更新のターゲット テーブル 'B' を指定することはできません

私はそれを解決しようとしました:

CREATE TABLE t2 AS select * FROM B;

元のクエリを次のように変更しました

UPDATE AB SET C = (SELECT sum(D) FROM t2 WHERE t2.E=ABE AND t2.F=2013 GROUP BY E) WHERE F=2013;

現在、実行には時間がかかり、MySQL は頻繁にクラッシュします。ポインタやヘルプをいただければ幸いです。クエリを最適化する方法についても同じことが言えます....

4

2 に答える 2

1

JOIN を使用します。

UPDATE A.B t1
JOIN (SELECT E, SUM(D) sumD
      FROM A.B
      WHERE F = 2013
      GROUP BY E) t2
USING (E)
SET C = sumD
WHERE F = 2013
于 2013-06-07T05:13:59.500 に答える
0

UPDATE A.B SET C = (SELECT SUM(D) FROM A.B t2 WHERE t2.E=A.B.E AND t2.F=2013 GROUP BY E) WHERE F=2013;

これは、更新が周期的である可能性があるためです...そのレコードを更新すると、WHERE条件がFALSEになる何かが発生した場合はどうなりますか? そうではないことはわかっていますが、エンジンはそうではありません。操作中のテーブルに反対のロックが存在する可能性もあります。

于 2013-06-07T12:55:38.163 に答える