这是正确的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)
答案 0 :(得分:1)
如果你查看SQL语句的执行计划,你就会明白发生了什么:
正如您所看到的(在我的情况下),查询优化器会扫描FROM子句中指定的两个表,并检索实现内部联接的行。
然后将这些行传递给表更新物理运算符,正如您所看到的那样,它被告知要在T1上执行更新(您可以通过在上面的查询中说“更新T1Alias”来告诉它执行此操作,您还可以通过SET命令告诉它要更新哪个字段)
在algebrizer将其编译为二进制文件后,查询分析器倾向于为您的查询选择最佳执行计划,因此,无论您是否获得与我相同的执行计划,都将取决于许多因素,包括您是否有索引表格。
希望这有帮助。