首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带联接重复的Update语句

问带联接重复的Update语句
EN

Stack Overflow用户
提问于 2018-05-22 07:08:51
回答 1查看 2.1K关注 0票数 5

当使用导致目标表中记录重复的内部联接执行更新时,关于将结果表的哪些行作为要应用于更新的记录的规则是什么?

例如:

T1:

代码语言:javascript
复制
|-------------|-------------|
|     col1    |     col2    |
|-------------|-------------|
|       1     |       A     |
|-------------|-------------|
|       1     |       B     |
|-------------|-------------|
|       1     |       C     |
|-------------|-------------|

T2:

代码语言:javascript
复制
|-------------|-------------|
|     col1    |     col2    |
|-------------|-------------|
|       1     |       D     |
|-------------|-------------|
|       1     |       E     |
|-------------|-------------|
|       1     |       F     |
|-------------|-------------|

执行以下函数将导致表1的col2中的所有3行都被设置为D。

代码语言:javascript
复制
UPDATE T1
SET col2 = T2.col2
FROM #TEMP T1 INNER JOIN #TEMP2 T2 ON T2.col1 = T2.col1

下面的代码说明了该示例:

代码语言:javascript
复制
SELECT 1 AS col1,'A' as col2 INTO #TEMP
INSERT INTO #TEMP
SELECT 1, 'B'
INSERT INTO #TEMP
SELECT 1, 'C'

SELECT 1 AS col1,'D' as col2 INTO #TEMP2
INSERT INTO #TEMP2
SELECT 1, 'E'
INSERT INTO #TEMP2
SELECT 1, 'F'

--SELECT * FROM #TEMP T1 INNER JOIN #TEMP2 T2 ON T2.col1 = T2.col1
--Result of below join

UPDATE T1
SET col2 = T2.col2
FROM #TEMP T1 INNER JOIN #TEMP2 T2 ON T2.col1 = T2.col1

SELECT * FROM #TEMP

为什么#TEMP的col2取D值?为什么不是E或F?这仅仅是因为它是连接中的第一条记录吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-05-22 11:16:37

我认为文档在这件事上是相当清楚的。我对最重要的部分作了大胆的说明:

在指定FROM子句以提供update操作的条件时要小心。 UPDATE语句的结果是未定义的,如果该语句包含一个FROM子句,而该子句没有以这样的方式指定,即如果UPDATE语句不是确定性的,则每一列发生的只有一个可用的值。例如,在下面脚本中的UPDATE语句中,Table1中的两行都符合UPDATE语句中FROM子句的限定条件;但未定义Table1中的哪一行用于更新Table2中的行。

换句话说,使用来自任意匹配行的值。没有关于哪一个的规则。

设置特定值的一种方便方法是使用apply

代码语言:javascript
复制
UPDATE T1
    SET col2 = T2.col2
    FROM #TEMP T1 CROSS APPLY
         (SELECT TOP (1) t2.*
          FROM #TEMP2 T2 
          WHERE T2.col1 = T2.col1
          ORDER BY ?  -- this ordering specifies the prioritization for the assignment
         ) T2;

ORDER BY指定要使用的行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50461747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档