3

我觉得我的头是泥泞的什么的。我试图弄清楚从另一个表更新一个表时 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

4 回答 4

1

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

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

于 2013-05-30T15:58:17.400 回答
0

您可以在没有连接的 SELECT 中使用相同的语法,但如果 colY 也存在于 table2 中,则需要为该表命名

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

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

于 2013-05-30T16:01:31.100 回答
0

这些子查询就是所谓的相关子查询。SELECT如果您要编写与 a而不是 an相同的查询, 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外部表中引用列。 Table1UPDATE命令中引用。您可以包含一个FROM子句,但这样的设置不需要它。

于 2013-05-30T16:03:51.717 回答
0

不,它正在做一个子查询,在这种情况下是两个。如果你还有另外 98 个 col 字段,那就太痛苦了。

您可以为 select 做类似的事情

select *,
(SELECT TOP 1 colX FROM table2 WHERE colZ = colY) as col1
From table1

左连接只会更有效

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

于 2013-05-30T16:03:08.553 回答