【问题标题】: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 中正确实现这一点?

【问题讨论】:

    标签: sql sql-server tsql sql-update


    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-10
          • 1970-01-01
          • 1970-01-01
          • 2014-10-05
          • 1970-01-01
          相关资源
          最近更新 更多