这两个查询之间有什么区别(最终结果)

时间:2018-01-17 14:46:05

标签: sql sql-server

我感兴趣的是这两个查询之间的区别是:

这个有SELECT TOP 1

UPDATE tblTemp SET [SOH] = (Select top 1 (tblstock.[Stock On Hand (Base UOM)])
 FROM tblstock
 WHERE tblTEMP.[ID] = tblstock.[ID])

而且这个不是

UPDATE tblTemp SET [SOH] = (Select tblstock.[Stock On Hand (Base UOM)])
FROM tblstock 
WHERE tblTEMP.[ID] = tblstock.[ID]

第一个会影响更多行。

所以我的问题是:他们在做同样的事情吗?

2 个答案:

答案 0 :(得分:3)

首先,第二个更恰当地写为:

UPDATE tblTemp
    SET [SOH] = tblstock.[Stock On Hand (Base UOM)]
    FROM tblstock 
    WHERE tblTEMP.[ID] = tblstock.[ID];

(没有理由让子查询没有FROM子句;它是一个浪费的SELECT。)

其次,他们不做同样的事情。如果没有匹配,第一个会将SOH设置为NULL。第二个不会改变现有价值。

这忽略了有多个匹配时会发生什么。 SQL Server未指定用于更新的行。因此,即使相同的查询也可能在相同数据的不同运行中产生不同的结果。

答案 1 :(得分:1)

在第一个查询中,您的子查询包含您的where子句。所以它将在tblTemp表中更新所有内容。

第二个查询在子查询之外提供了where子句,因此将其应用于tblTemp表。