2017-11-28 1 views
0

Ich habe 2 Tabellen, Order und Order_Product. Jedes Produkt in Order_Product hat ein Flag, um zu sagen, ob die Produktdaten per E-Mail gesendet wurden oder nicht (IsEmailed). Wenn alle Produkte auf einer Bestellung per E-Mail wurden dann muss ich die Order Tabelle ändern eine Order_Status_Id von 2.SQL Server: Tabelle aktualisieren, wenn alle Zeilen in einer anderen Tabelle ein Kriterium

Der Code unten haben, den Status, wenn OP.IsEmailed = 1 in jeder Zeile der Sub-Abfrage ändern, ist dies nicht korrekt. Es muss geändert werden, wenn OP.IsEmailed = 1 für ALLE Zeilen in der Ordered_Product_2016 Unterabfrage. Kann mir jemand helfen?

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 

bearbeiten - ich habe es wie unten erreichen kann, aber es führen muss einen besseren Weg geben.

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 

Antwort

1

Im Folgenden wird das tun, was Sie brauchen:

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

Danke, versucht, die intitial Antwort und lief in das gleiche Problem wie die ursprüngliche Frage –

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) 

Ich habe nicht getestet. Gib dir nur eine Idee.

+0

ah ja, das sollte mit einer Arbeit kommen, dank –

Verwandte Themen