Я совершенно нуб в sql. Я думаю, что лучший способ сделать это; У меня есть квитанция с этими полями:
Receipt
-------
ReceiptID, AssociatedReceiptID, Value, Total
Я хочу обновить поле Total всех строк с одним и тем же AssociatedReceiptID с суммой их полей Value. Итак, я попробовал следующий SQL-оператор:
UPDATE Receipt r1
SET Total = (SELECT sum(Value)
FROM Receipt r2
WHERE r2.AssociatedReceiptID = r1.AssociatedReceiptID
GROUP BY r2.AssociatedReceiptID)
С более чем 100000 записей в этой таблице, это продолжается более 17 часов. Поскольку я обновляю ту же таблицу, которую запрашиваю, я решил разделить ее на два оператора обновлений, сохранив результат суммирования во временной таблице (которая имеет), а затем обновив таблицу квитанций с этими значениями.
UPDATE TemporaryTable t1
SET Total = (SELECT sum(Value)
FROM Receipt r2
WHERE r2.AssociatedReceiptID = t1.AssociatedReceiptID
GROUP BY r2.AssociatedReceiptID)
UPDATE Receipt r1
SET Total = (SELECT Total
FROM TemporaryTable t1
WHERE t1.ReceiptID = r1.ReceiptID)
Используя эти утверждения, процесс обновления занимает 6-7 часов. Но я уверен, что должен быть лучший способ сделать это. Итак, вкратце, это мои вопросы:
- Как тебе это лучше?
- Подзапрос в операторах обновления выполняется один раз для каждой строки, не так ли? Итак, если имеется 10 строк с одинаковым AssociatedReceiptID, сумма рассчитывается 10 раз. Как рассчитать сумму только один раз для AssociatedReceiptID в операторе обновления?
Заранее спасибо.