在SQL Server

时间:2017-03-08 02:56:34

标签: sql sql-server

假设我有桌子

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

那么,它总是从第一行更新?只是想确保正确的行为,因为我即将更新的内容非常关键。

1 个答案:

答案 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