繁体   English   中英

SQL Server:如果另一个表中的所有行均符合条件,则更新表

[英]SQL Server : update table if all rows in another table match a criteria

我有2个表OrderOrder_Product Order_Product中的每个产品都有一个标志,用于说明是否已通过电子邮件发送了产品数据( IsEmailed )。 如果订单上的所有产品都已通过电子邮件发送,那么我需要将Order表更改为Order_Status_Id为2。

如果子查询的任何行中OP.IsEmailed = 1 ,则以下代码将更改状态,这是不正确的。 如果Ordered_Product_2016子查询中的所有行的OP.IsEmailed = 1 ,则需要更改。 有人可以帮我吗?

CREATE PROCEDURE Update_Order_Status 
    @Order_Ids [dbo].Id_List READONLY
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE Order_2016
    SET Order_Status_Id = 2 -- status of 2 means emails have been sent for all products on this order
    FROM Order_2016
    WHERE Order_Id IN (SELECT Order_Id 
                       FROM Ordered_Product_2016 OP
                       WHERE OP.Order_Id IN (SELECT Id FROM @Order_Ids) 
                         AND OP.IsEmailed = 1)
END
GO

编辑 -我可以像下面那样完成它,但是必须找到更好的方法。

CREATE PROCEDURE Update_Order_Status 
    @Order_Ids [dbo].Id_List READONLY
AS
BEGIN
    SET NOCOUNT ON;

    IF NOT EXISTS(SELECT Order_Id FROM Ordered_Product_2016 
                  WHERE Order_Id IN (SELECT Id FROM @Order_Ids) 
                    AND (IsEmailed = 0 OR IsEmailed IS NULL))
    BEGIN;
        UPDATE Order_2016
        SET Order_Status_Id = 2 -- status of 2 means emails have been sent for all products on this order
        FROM Order_2016
        WHERE Order_Id IN (SELECT Order_Id 
                           FROM Ordered_Product_2016 OP
                           WHERE OP.Order_Id IN (SELECT Id FROM @Order_Ids)  
                             AND OP.IsEmailed = 1)
    END;
END
GO
CREATE PROCEDURE Update_Order_Status 
@Order_Ids [dbo].Id_List READONLY
AS
BEGIN
SET NOCOUNT ON;

UPDATE Order_2016
SET Order_Status_Id = 2 -- status of 2 means emails have been sent for all products on this order
FROM Order_2016 o inner join Ordered_Product_2016 OP on O.Order_Id = OP.Order_Id 
WHERE not (OP.IsEmailed is null or OP.IsEmailed <> 1)

我还没有测试。 只是给你一个主意。

以下将满足您的需求:

UPDATE O
SET Order_Status_Id = 2
FROM
    Order_2016 O
    JOIN Ordered_Product_2016 OP_Check ON O.Order_Id = OP_Check.Order_Id
    -- the above join is optional; it would prevent the updating of orders having no records in Ordered_Product_2016
    LEFT JOIN Ordered_Product_2016 OP ON
        O.Order_Id = OP.Order_Id
        AND OP.IsEmailed <> 1 OR OP.IsEmailed IS NULL
WHERE OP.Order_Id IS NULL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM