关于如何分离 UpdateTarget 和 Filter
Posted
技术标签:
【中文标题】关于如何分离 UpdateTarget 和 Filter【英文标题】:Over how to separate UpdateTarget and Filter 【发布时间】:2020-02-14 08:26:58 【问题描述】:想象一下带有列的下表
TrackingID | CompletionIndicator | Flag2
现在我想用Completion Indicator = 0
计算跟踪 ID 级别的所有位置,但我想更新跟踪 ID 级别。
使用下面的代码只更新带有 0 的行。 (逻辑上!)。但是如何将过滤器和更新目标分开呢?
UPDATE UPDATETarget
SET Flag2 = New_Index
FROM (
SELECT Flag2
,COUNT(*) OVER (
PARTITION BY TrackingID ORDER BY id DESC
) AS New_Index
FROM [dbo].Feedback
WHERE CompletionIndicator = 0
) AS UPDATETarget
【问题讨论】:
我正在使用 MS SQL 2014,抱歉我现在标记了它。 【参考方案1】:如果我理解正确,您可以在此表中包含多个 TrackingID 条目。 所以可能这会做你想做的事,有点老式,更推荐使用 WITH
UPDATE FB
SET Flag2 = Src.NewIndex
FROM [dbo].Feedback AS FB
JOIN
(SELECT TrackingID, COUNT(*) AS NewIndex
FROM [dbo].Feedback
WHERE CompletionIndicator = 0
GROUP BY TrackingID) AS Src
ON Src.TrackingID = FB.TrackingID;
我建议始终先使用 SELECT 仔细检查您希望通过该查询更新的内容。
SELECT FB.*, Src.NewIndex
FROM [dbo].Feedback AS FB
JOIN
(SELECT TrackingID, COUNT(*) AS NewIndex
FROM [dbo].Feedback
WHERE CompletionIndicator = 0
GROUP BY TrackingID) AS Src
ON Src.TrackingID = FB.TrackingID;
【讨论】:
你应该把它改成LEFT JOIN
。
如果 David 想要更新所有表,那么是的,你是对的,应该是 LEFT JOIN,我仍然不确定任务
。 . OP 暗示查询应该使用 0
值更新行。以上是关于关于如何分离 UpdateTarget 和 Filter的主要内容,如果未能解决你的问题,请参考以下文章