Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在更新SQL表w/CTE和来自其他表的多个结果_Sql_Sql Server_Common Table Expression - Fatal编程技术网

正在更新SQL表w/CTE和来自其他表的多个结果

正在更新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

我使用以下查询;但它不起作用。挑战在于e.Value可以为每个文档(以及每个设备)返回多个结果,我想用最新的e.Value更新Equipment.LastCheck(因此d.CreatedDate的订单)

无论我尝试什么,设备.LastCheck都不会更新。谁能告诉我我做错了什么

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确实表现得更好。请参阅我的更新答案和完整的查询,包括上面马丁·史密斯的评论。