哪个行用于使用连接表中的值更新父表?

时间:2018-05-09 15:17:12

标签: sql sql-server

我有一个用例,要求我使用连接表的第一行(按插入顺序)重新填充表格。

我写过这个简单的查询:

UPDATE parent
SET parent.FirstChildField = child.Field
FROM Parents parent
INNER JOIN Children AS child
ON child.parentId = parent.Id

此查询是否从已加入子项的第一行或最后一行更新具有字段值的FirstChildField?现有数据库使用Guids作为主键。

1 个答案:

答案 0 :(得分:2)

SQL Server documentation明确警告:

  

指定FROM子句以提供条件时要小心   用于更新操作。 UPDATE语句的结果是   如果语句包含不是的FROM子句,则为undefined   以这样的方式指定,每个只有一个值可用   更新的列出现,即UPDATE语句是否   不确定。

我认为文档有点苛刻。结果是不确定的,但结果值应来自其中一行,因此结果未完成未定义。

它没有特定的行。无法保证同一系统上相同数据的相同更新将产生相同的结果。

您可以使用apply控制哪些更新:

UPDATE p
    SET FirstChildField = c.Field
FROM Parents p CROSS APPLY
     (SELECT TOP (1) c.*
      FROM Children c
      WHERE c.parentId = p.Id
      ORDER BY ?
     ) c;

?用于确定要用于update的行的列。