更新单列中的多行

Posted

技术标签:

【中文标题】更新单列中的多行【英文标题】:Updating multiple rows in single column 【发布时间】:2020-02-18 09:05:16 【问题描述】:

我需要使用生成多行的子查询的结果更新新添加的列(存储发票所有项目的总和)。我在 Invoice 表中添加了新列。

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 Server 中正确实现这一点?

【问题讨论】:

【参考方案1】:

您可以使用相关子查询:

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

如果基础发票金额发生变化,ItemsSum 将无效。

【讨论】:

【参考方案2】:

相关的是:

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

【讨论】:

【参考方案3】:

Yogesh 的回答是正确的,但如果您愿意,也可以使用显式聚合来做到这一点:

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

【讨论】:

以上是关于更新单列中的多行的主要内容,如果未能解决你的问题,请参考以下文章

从记录类型单列拆分/提取值,将用户定义的函数应用于多行 CTE

如何使用 SQL 更新单列中的某些值组

Excel技巧--单列变多行

将单列转换为多行

将多列合并为单列[重复]

使用 Doctrine 获取多行单列数组