正在更新SQL表w/CTE和来自其他表的多个结果
我使用以下查询;但它不起作用。挑战在于e.Value可以为每个文档(以及每个设备)返回多个结果,我想用最新的e.Value更新Equipment.LastCheck(因此d.CreatedDate的订单) 无论我尝试什么,设备.LastCheck都不会更新。谁能告诉我我做错了什么正在更新SQL表w/CTE和来自其他表的多个结果,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,我使用以下查询;但它不起作用。挑战在于e.Value可以为每个文档(以及每个设备)返回多个结果,我想用最新的e.Value更新Equipment.LastCheck(因此d.CreatedDate的订单) 无论我尝试什么,设备.LastCheck都不会更新。谁能告诉我我做错了什么 WITH cte AS (SELECT eq.LastCheck, e.Value AS Res
WITH cte
AS (SELECT eq.LastCheck,
e.Value AS Result,
ROW_NUMBER() OVER (ORDER BY d.CreatedDate DESC) AS Rn
FROM Equipment eq
INNER JOIN Documents d
ON d.EquipmentId = eq.EquipmentId
INNER JOIN Elements e
ON e.ElementId = d.ElementId
WHERE e.Name = 'CheckDate'
AND e.Value IS NOT NULL)
UPDATE cte
SET LastCheck = Result;
试试这个:
WITH cte
AS (SELECT eq.LastCheck,
e.Value AS Result,
ROW_NUMBER() OVER (ORDER BY d.CreatedDate DESC) AS Rn
FROM Equipment eq
INNER JOIN Documents d
ON d.EquipmentId = eq.EquipmentId
INNER JOIN Elements e
ON e.ElementId = d.ElementId
WHERE e.Name = 'CheckDate'
AND e.Value IS NOT NULL)
UPDATE cte
SET LastCheck = Result
WHERE Rn = 1
以下是一种不使用CTE的方法:
UPDATE eq
SET eq.LastCheck = e.Value
FROM Equipment eq
INNER JOIN Documents d ON d.EquipmentID = eq.EquipmentID
INNER JOIN Elements e ON e.ElementID = d.ElementID
WHERE d.EquipmentID = eq.EquipmentID
AND e.Name = 'CheckDate'
AND e.Value IS NOT NULL
AND NOT EXISTS (
SELECT *
FROM Documents d2
INNER JOIN Elements e2 ON e2.ElementID = d2.ElementID
WHERE d2.CreatedDate > d.CreatedDate AND d2.EquipmentID = eq.EquipmentID
)
NOT EXISTS语句确保返回具有最新CreatedDate的文档记录
更新: 使用CTE更有效。下面是执行所需操作的完整查询,根据Martin Smith的评论建议,通过eq.EquipmentID合并分区,其中Rn=1
WITH cte AS (
SELECT eq.LastCheck,
e.Value AS Result,
ROW_NUMBER() OVER (
PARTITION BY eq.EquipmentID
ORDER BY d.CreatedDate DESC
) AS Rn
FROM Equipment eq
INNER JOIN Documents d ON d.EquipmentId = eq.EquipmentId
INNER JOIN Elements e ON e.ElementId = d.ElementId
WHERE e.Name = 'CheckDate'
AND e.Value IS NOT NULL
)
UPDATE cte
SET LastCheck = Result
WHERE Rn = 1
您缺少
WHERE Rn=1
@MartinSmith我认为不应该有任何“WHERE Rn=1”,因为Rn将是子查询结果中的序列号。如果我把Rn=1放在那里,它只会更新子查询的第一个结果。啊,你也缺少一个由eq.EquipmentId划分的分区。虽然我不会那样做。@MartinSmith我愿意接受所有建议,如果你有更好的方法,请告诉我。这只是一个部分解决方案,请参阅MartinSmith对我最初博文的评论谢谢。设备表中有40K个条目,文档中有100K多个条目,元素表中有超过1MN个条目。简而言之:性能很重要!你能给我一个很好的理由,为什么我会或不会使用CTE?我真的没有理由不使用CTE,这只是另一种方法。但当我观察性能时,CTE确实表现得更好。请参阅我的更新答案和完整的查询,包括上面马丁·史密斯的评论。