![](/img/trans.png)
[英]Sql return all rows from parent table where criteria match from another child of a child table
[英]SQL Server : update table if all rows in another table match a criteria
我有2个表Order
和Order_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.