如果没有连接,t-sql更新如何工作

时间:2013-05-30 15:51:20

标签: sql-server tsql join

我觉得我的脑袋很泥泞。我试图弄清楚当从另一个表更新一个表时,如果没有连接,t-sql更新是如何工作的。我过去总是使用连接,但遇到了一个存储过程,其他人创建了一个没有连接的连接。此更新正在SQL 2008R2中使用,并且可以正常运行。

Update table1

SET col1 = (SELECT TOP 1 colX FROM table2 WHERE colZ = colY),

col2 = (SELECT TOP 1 colE FROM table2 WHERE colZ = colY)

显然,colY是table1中的一个字段。要在select语句(而不是更新)中获得相同的结果,需要连接。我想我不明白更新是如何在幕后工作但它必须做某种加入?

4 个答案:

答案 0 :(得分:1)

SQL Server将这些子查询转换为连接。您可以通过获取查询计划来查看此信息。您可以使用UPDATE ... FROM ... JOIN语法编写等效查询,并观察查询计划基本相同。

显示的示例代码不常见,难以理解,冗余且不灵活。我建议不要使用这种风格。

答案 1 :(得分:0)

您可以在没有连接的SELECT中使用相同的语法,但如果table2中也存在colY,则需要对表进行别名

SELECT (SELECT TOP 1 colX FROM table2 WHERE colZ = T.colY)
, (SELECT TOP 1 colE FROM table2 WHERE colZ = T.colY)
FROM table1 AS T

我只是在为我自己的信息构建一个即席查询时才使用这种东西。如果将它放入任何类型的永久代码中,我会将其转换为连接,因为它更易于阅读和更易于维护。

答案 2 :(得分:0)

不,它正在进行子查询,在这种情况下是两个。如果你有另外98个场地,那该死的很痛苦。

你可以为选择

做类似的事情
select *,
(SELECT TOP 1 colX FROM table2 WHERE colZ = colY) as col1
From table1

左连接会更有效率

您的示例除非dbms对其进行优化,否则它将为表中的每一行运行子查询。 不得不说谁写的不太合格。

答案 3 :(得分:0)

这些子查询是所谓的相关子查询。如果您要编写与SELECT相同的查询而不是UPDATE,则会看起来像这样。

SELECT col1 = (SELECT TOP 1 table2.colX FROM table2 WHERE table2.colZ = table1.colY),
    col2 = (SELECT TOP 1 table2.colE FROM table2 WHERE table2.colZ = table1.colY)
FROM table1

JOIN表示您正在引用子查询内部的外部表中的列。 Table1命令中引用了UPDATE。您可以包含FROM子句,但这样的设置不需要它。