SQL Server触发器与CTE一起在插入后更新另一个字段
我创建了一个触发器,用于在插入后更新列。我遇到的问题是,IsNowComplete CTE似乎无法处理包含多个项目的多个拾取列表。我如何解释这种情况?我的触发器的代码:SQL Server触发器与CTE一起在插入后更新另一个字段,sql,sql-server,triggers,Sql,Sql Server,Triggers,我创建了一个触发器,用于在插入后更新列。我遇到的问题是,IsNowComplete CTE似乎无法处理包含多个项目的多个拾取列表。我如何解释这种情况?我的触发器的代码: AFTER INSERT, UPDATE AS WITH WasComplete AS ( SELECT pl.IsComplete, pl.Id FROM dbo.PickList pl JOIN
AFTER INSERT, UPDATE
AS
WITH WasComplete AS
(
SELECT
pl.IsComplete, pl.Id
FROM
dbo.PickList pl
JOIN
inserted i ON pl.Id = i.PickListId
), IsNowComplete AS
(
SELECT
i.PickListId,
IsNowComplete = CASE
WHEN COUNT(1) > 0 THEN 0 ELSE 1
END
FROM
dbo.PickListContent plc
JOIN
inserted i ON plc.PickListId = i.PickListId
WHERE
plc.PickListId = i.PickListId
AND plc.QuantityPicked != plc.QuantityNeeded
GROUP BY
i.PickListId
)
UPDATE pl
SET IsComplete = CASE
WHEN ws.IsComplete = 0 AND inc.IsNowComplete = 1
THEN 1
WHEN ws.IsComplete = 1 AND inc.IsNowComplete = 0
THEN 0
ELSE
ws.IsComplete
END
FROM dbo.PickList pl
JOIN WasComplete ws ON pl.Id = ws.Id
JOIN IsNowComplete inc ON ws.Id = inc.PickListId
END
请将现在不完整的WHERE条款修改为 和plc.QuantityChecked不存在选择plc1.QuantityRequired from dbo.PickListContent plc1 如果没有空值,也可以使用NOT IN
希望这能有所帮助。这里是一个很好的起点。我看到你在做一个没有分组依据的COUNT1,这可能是一个错误,但因为我不知道你的数据、当前结果或期望的结果,我不知道应该是什么。我注意到我在发布后没有分组依据。我编辑了上面的声明。谢谢仍在寻找如何解释可能包含来自inserted的多个项目的多个拾取列表。@AudiDriver您的WASSOMPLETE查询将inserted中的多个记录视为一个表,并包括insert/update中包含的所有拾取列表。在这里,我将对pl.IsComplete、pl.Id执行一个groupby,以防inserted包含相同PickListId的多个记录。您的IsComplete查询似乎只有一半好,因为它正确地将inserted视为一个表,并且有一个group by返回在此insert/update中受影响的唯一选取列表,但是任何在picklistcontent中没有记录的选取列表都不会被包括在内,并且将从update语句中跳过。@谢谢您的建议。将GROUP BY与IsNowComplete CTE一起添加到WasComplete CTE似乎解决了我的问题。如果picklistcontent中不存在记录,我不想执行更新。