首页 > 解决方案 > 根据不同列的值更新列的数据

问题描述

更新发票日期

我只想用 ShipDate 更新 InvoiceDate 如果订单的所有行都具有“已发货”状态。

在此示例中,Order 100 的行的 Status 值不是 'Shipped' 。所以我不应该为此 Order 更新 InvoiceDate 。订单 200 的所有行的状态值为“已发货”。所以我可以更新这个订单的 InvoiceDate。

请让我知道如何为此要求编写 SQL 查询?

    UPDATE SalesTable A SET A.InvoiceDate= A.ShipDate, 
    WHERE A.Status= 'Shipped' AND A.InvoiceDate <> A.ShipDate and
     NOT EXISTS ( SELECT 1 FROM SalesTable B WHERE B.OrderNumber=A.OrderNumber AND B.Status!='Shipped');

标签: mysqlsql

解决方案


在 MySQL 中,您需要使用join

UPDATE SalesTable st JOIN
       (SELECT st2.OrderNumber
        FROM SalesTable st2
        GROUP BY st2.OrderNumber
        HAVING SUM( B.Status <> 'Shipped') = 0
       ) st2
       USING (OrderNumber)
    SET st.InvoiceDate = st.ShipDate;

您不能(轻松)在查询的任何其他部分引用正在更新的表。


推荐阅读