Помимо причины, о которой вы упомянули в своем ответе, то, что вы пытаетесь сделать, противоречит способу использования SQL.Попробуйте обновить данные в наборах, а не по строкам.
Я не положительный , так как я не знаю ваш дизайн таблицы, но я считаю, что должно работать следующее.Вы можете получить от этого лучшую производительность.В частности, я предполагаю, что QTY_CHANGE
исходит от #ia
, хотя это может быть и не так.
UPDATE #ia as a set (OLD_QTY, NEW_QTY) = (SELECT #lots.QTY_RECEIVED + (COUNT(b.*) * a.QTY_CHANGE),
#lots.QTY_RECEIVED + ((COUNT(b.*) + 1) * a.QTY_CHANGE)
FROM #lots
LEFT JOIN #ia as b
ON b.INV_GUID = a.INV_GUID
AND b.OLD_VID = a.OLD_VID
AND b.ENTRY_NUM < a.ENTRY_NUM
WHERE #lots.INV_GUID = a.INV_GUID
AND #lots.LOT_VID = a.OLD_VID)
WHERE EXISTS (SELECT '1'
FROM #lots
WHERE #lots.INV_GUID = a.INV_GUID
AND #lots.LOT_VID = a.OLD_VID)
EDIT:
... предыдущая версия ответа была написана с точки зрения DB2, хотя в противном случае она была бы независимой от БД.Также возникла проблема использования одинакового значения QTY_CHANGE
для каждой строки, что маловероятно.Это должна быть более идиоматическая версия SQL Server 2008, с большей вероятностью вывести правильный ответ:
WITH RT AS (SELECT #IA.inv_guid, #IA.old_vid, #IA.entry_num,
COALESCE(MAX(#Lots.qty_received), 0) +
SUM(#IA.qty_change) OVER(PARTITION BY #IA.inv_guid, #IA.old_vid
ORDER BY #IA.entry_num)
AS running_total
FROM #IA
LEFT JOIN #Lots
ON #Lots.inv_guid = #IA.inv_guid
AND #Lots.lot_vid = #IA.old_vid)
UPDATE #IA
SET #IA.old_qty = RT.running_total - #IA.qty_change, #IA.new_qty = RT.running_total
FROM #IA
JOIN RT
ON RT.inv_guid = #IA.inv_guid
AND RT.old_vid = #IA.old_vid
AND RT.entry_num = #IA.entry_num