Обновление нескольких строк в одном столбце - PullRequest
0 голосов
/ 18 февраля 2020

Мне нужно обновить только что добавленный столбец (сохранить сумму всех элементов счета-фактуры) с результатом подзапроса, который генерирует более одной строки. Я добавил новый столбец в таблицу Счет .

ALTER TABLE Invoice
ADD ItemsSum int NULL

Я пытался выполнить следующий запрос, но он дал ошибку из-за нескольких результатов

UPDATE Invoice
SET ItemsSum = (SELECT SUM(Amount)
               FROM InvoiceItem it
               INNER JOIN Invoice i ON it.InvoiceID = i.ID
               GROUP BY i.ID)

Как правильно добиться этого на SQL Сервере?

Ответы [ 3 ]

2 голосов
/ 18 февраля 2020

Вы можете использовать коррелированный подзапрос:

UPDATE Invoice
     SET ItemsSum = (SELECT SUM(it.Amount) 
                     FROM InvoiceItem it 
                     WHERE it.InvoiceID = Invoice.ID
                    );

ItemsSum будет недействительным, если основная сумма счета будет изменена.

0 голосов
/ 18 февраля 2020

Yoge sh ответ правильный, но если хотите, вы также можете сделать это, используя явное агрегирование:

UPDATE i
    SET ItemsSum = ii.sumAmount
FROM Invoice i LEFT JOIN
     (SELECT ii.InvoiceID, SUM(Amount) as sumAmount
      FROM InvoiceItem it
      GROUP BY ii.InvoiceID
     ) ii
     ON ii.InvoiceID = i.ID
0 голосов
/ 18 февраля 2020

коррелирует это:

UPDATE Invoice
     SET ItemsSum = (SELECT SUM(invc.Amount) 
                     FROM InvoiceItem invc 
                     WHERE invc.InvoiceID = Invoice.ID
                     GROUP BY Invoice.ID;
                    );
...