2017-11-28 8 views
0

2つのテーブルOrderOrder_Productがあります。 Order_Productの各製品には、製品データが電子メールで送信されたかどうかを示すフラグ(IsEmailed)があります。オーダーのすべての製品は電子メールで送信されている場合は、私は2SQL Server:別のテーブルのすべての行が条件に一致する場合のテーブルの更新

Order_Status_Id次のコードを持っているOrderテーブルを変更する必要があり、サブクエリの任意の行でOP.IsEmailed = 1場合、ステータスが変更されます、これは正しくありません。 OP.IsEmailed = 1ALLの場合はOrdered_Product_2016サブクエリに変更する必要があります。誰も私に手を貸すことができますか?

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 

答えて

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 
+0

おかげで、intitial答えを試してみましたが、元の質問と同じ問題に遭遇しました –

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 o inner join Ordered_Product_2016 OP on O.Order_Id = OP.Order_Id 
WHERE not (OP.IsEmailed is null or OP.IsEmailed <> 1) 

私がテストしていません。アイデアを伝えてください。

+0

がええああそれは参加して動作するはずです、ありがとう –

関連する問題