我觉得我的脑袋很泥泞。我试图弄清楚当从另一个表更新一个表时,如果没有连接,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语句(而不是更新)中获得相同的结果,需要连接。我想我不明白更新是如何在幕后工作但它必须做某种加入?
答案 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
子句,但这样的设置不需要它。