SQL查询:从中更新

时间:2013-11-25 10:18:36

标签: sql sql-server-2008 sql-update

这是正确的SQL:

UPDATE T1alias
SET T1alias.Row2 = T2alias.Row2
FROM 
(
   T1 AS T1alias
   INNER JOIN 
   T2 AS T2alias
   ON T1alias.Row1 = T2alias.Row1
)

此查询似乎返回正确的结果,但我不明白为什么。 我的意思是FROM子句引用一个完整的不同数据集,表T1必须更新。 F.e:

 T1                                 T2
----------------------             ----------------------
| Row1 | Row2 | Row3 |             | Row1 | Row2 | Row3 |  
----------------------             ----------------------
| 1    | 2    | 3    |             | 1    | 7    | 8    |  
---------------------              ----------------------
| 4    | 5    | 6    |             | 9    | 10   | 11   |  
----------------------              ----------------------
 T1 INNER JOIN T2 ON T1alias.Row1 = T2alias.Row1
-------------------------------------------------------------
| T1.Row1 | T1.Row2 | T1.Row3 | T2.Row1 | T2.Row2 | T2.Row3 |  
-------------------------------------------------------------
| 1       | 2       | 3       |  1      | 7       | 8       |  
-------------------------------------------------------------

那么如何从已连接的表中更新T1?

在我看来,这些是完整的不同数据集。 我会理解sql查询,如果它看起来像:

UPDATE T1alias
SET T1alias.Row2 = T2alias.Row2
FROM 
(
   T1 AS T1alias
   INNER JOIN 
   T2 AS T2alias
   ON T1alias.Row1 = T2alias.Row1
) AS T1T2JoinedAlias
WHERE T1T2JoinedAlias.Row1 = T1alias.Row1

请有人向我解释这些。 (我正在使用Microsoft SQL Server 2008 R2)

1 个答案:

答案 0 :(得分:1)

如果你查看SQL语句的执行计划,你就会明白发生了什么:

Execution Plan of Update Query

正如您所看到的(在我的情况下),查询优化器会扫描FROM子句中指定的两个表,并检索实现内部联接的行。

然后将这些行传递给表更新物理运算符,正如您所看到的那样,它被告知要在T1上执行更新(您可以通过在上面的查询中说“更新T1Alias”来告诉它执行此操作,您还可以通过SET命令告诉它要更新哪个字段)

在algebrizer将其编译为二进制文件后,查询分析器倾向于为您的查询选择最佳执行计划,因此,无论您是否获得与我相同的执行计划,都将取决于许多因素,包括您是否有索引表格。

希望这有帮助。