我有一个用例,要求我使用连接表的第一行(按插入顺序)重新填充表格。
我写过这个简单的查询:
UPDATE parent
SET parent.FirstChildField = child.Field
FROM Parents parent
INNER JOIN Children AS child
ON child.parentId = parent.Id
此查询是否从已加入子项的第一行或最后一行更新具有字段值的FirstChildField?现有数据库使用Guids作为主键。
答案 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
的行的列。