繁体   English   中英

在SQL Server中使用JOIN一对多关系进行UPDATE SELECT

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM