[英]UPDATE SELECT with JOIN one-to-many relationship in SQL server
假设我有桌子
一种
Col1 Col2
1 AB
2 CD
乙
Col1 Col2
1 EF
1 GH
2 IJ
2 KL
如果我有以下查询
UPDATE A
SET Col2 = B.Col2
FROM A
INNER JOIN B ON A.Col1 = B.Col1
我尝试了这个,结果是
一种
Col1 Col2
1 EF
2 IJ
因此,它总是从第一行更新吗? 我只是想确保行为正确,因为我要更新的内容非常关键。
当您谈论RDBMS中的表时,没有“第一行”或“最后一行”这样的定义。 如果您未指定任何顺序,则数据库引擎可以自由使用任何记录作为“第一记录”。 当然也有例外,例如存在聚集索引,排序规则等。
如果您不指定任何订单,则不能简单地假设第一个记录是什么。
建议您修改查询以使用要在更新中使用的值的预定义顺序。 例如,如果您想更新为以字母数字顺序排在第一位的值,请使用以下查询:
UPDATE A
SET Col2 = B.Col2
FROM A
INNER JOIN
(
SELECT Col1, Col2,
ROW_NUMBER() OVER(PARTITION BY Col1 ORDER BY Col2) rn
)
B ON A.Col1 = B.Col1 AND b.rn=1
请注意,当您指定订单时,可以在完全不同的列中设置订单。 假设您有一个DateUpdated列,并且希望基于最新的DateUpdated事件使用最新的值:
UPDATE A
SET Col2 = B.Col2
FROM A
INNER JOIN
(
SELECT Col1, Col2, DateUpdated,
ROW_NUMBER() OVER(PARTITION BY Col1 ORDER BY DateUpdated DESC) rn
)
B ON A.Col1 = B.Col1 AND b.rn=1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.