Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL server中的联接一对多关系更新选择_Sql_Sql Server - Fatal编程技术网

使用SQL server中的联接一对多关系更新选择

使用SQL server中的联接一对多关系更新选择,sql,sql-server,Sql,Sql Server,假设我有一张桌子 A B 如果我有以下疑问 UPDATE A SET Col2 = B.Col2 FROM A INNER JOIN B ON A.Col1 = B.Col1 我试过这个,结果是 A 那么,它总是从第一行开始更新?我只是想确保行为正确,因为我将要更新的内容非常关键。在讨论RDBMS中的表时,没有“第一行”或“最后一行”这样的定义。如果未指定任何顺序,则数据库引擎可以将任何记录用作第一条记录。当然也有例外,例如存在聚集索引、排序规则等 如果不指定任何订单,则不能简单地假定第一条记

假设我有一张桌子

A

B

如果我有以下疑问

UPDATE A
SET Col2 = B.Col2
FROM A
INNER JOIN B ON A.Col1 = B.Col1
我试过这个,结果是

A


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

在讨论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

不,重要的是要理解有自然的“第一排”。您必须始终指定一个
ORDER BY
来指定第一行。它从随机行更新。(在本例中,以及在许多情况下,这是您识别为第一行的行)确定需要从识别和筛选“第一行”的源更新的更新源。如果您基于“第一行没有order by”的思想构建业务逻辑,您将有bug。似乎您在表表达式中缺少了FROM。也就是说,解决方案中缺少表B
Col1 Col2
 1    EF
 2    IJ
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
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