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
Danke, versucht, die intitial Antwort und lief in das gleiche Problem wie die ursprüngliche Frage –