2013-06-07 3 views
1

Здесь A представляет собой базу данных и В представляет собой таблицу А и С, D, E, F являются столбцы таблицы B.Oracle PLSQL, чтобы обновление MySQL Query

ОБНОВЛЕНИЕ АВ КОМПЛЕКТ С = (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. Вы не можете указать целевую таблицу «B» для обновления в предложении FROM 0.000 сек

Я попытался решить эту проблему с:

CREATE TABLE t2 AS SELECT * FROM B;

, а затем модифицировать исходный запрос, чтобы стать

ОБНОВЛЕНИЕ АВ НАБОР С = (SELECT сумма (D) FROM t2 WHERE t2.E = АВЕ И t2.F = 2013 GROUP BY E), где F = 2013;

Теперь требуется много времени для запуска, и MySQL часто сбой. Любые указатели или помощь приветствуются. То же самое касается любого метода оптимизации запроса ....

ответ

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 
+0

спасибо ... я смог сделать этот запрос быстрым, индексируя E ... это сработало !! – Harsh

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? Вы знаете, что это не тот случай, но у двигателя нет. Там также могут быть противоположные блокировки на столе в операции.