假设我有桌子
A
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
我尝试了这个,结果是
A
Col1 Col2
1 EF
2 IJ
那么,它总是从第一行更新?只是想确保正确的行为,因为我即将更新的内容非常关键。
答案 0 :(得分:1)
没有这样的定义和#34;第一行"或者"最后一行"当你在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