针对两个更新和搜索查询的高效SQL查询

时间:2010-02-01 19:46:27

标签: sql sql-server search sql-update

我有这样的查询:

SELECT TOP 1 ID, DATA, OTHERINF FROM MYTABLE WHERE DATE = @DATE

并且在读取行数据并使用它之后,我想更新检索到的行并更改其中一个列(在另一个事务中)。

但正如你在这里看到的那样,我两次搜索那一行。有没有什么方法可以记住行并进行更新而无需再次搜索。

谢谢。

5 个答案:

答案 0 :(得分:4)

在第一个查询中,您检索了ID。在第二个查询中使用它来查找要更新的行而不是使用日期:

UPDATE MYTABLE
SET DATA = 'FooBar'
WHERE ID = 200

答案 1 :(得分:0)

--Note, need to setup proper data types
DECLARE @Id INT
DECLARE @Data VARCHAR(MAX)
DECLARE @OtherInf VARCHAR(max)

SELECT TOP 1 @id = Id, @Data = Data, @OtherInf = OtherInf
FROM MyTable
WHERE Date = @Date

--Now you can do what you need, using the info above.

这应该这样做

答案 2 :(得分:0)

您可以将UPDATE与SELECT组合到一个语句中,但不能跨两个事务组合。因此,如果您需要更新另一个事务中的值而不是您选择它(原因我不清楚),您需要两个语句。

答案 3 :(得分:0)

我认为DATE列没有编入索引(如果不是,为什么不?)那么,最好的办法是确保检索主键(不是那个ID?)然后用它作为你的更新中的条件。

答案 4 :(得分:0)

我知道它不流行,但你也可以对游标进行定位更新 e.g。

use Northwind
GO



DECLARE EMP_CURSOR CURSOR 
FOR SELECT TOP 1 EmployeeID, LastName FROM EMPLOYEES WHERE  HireDate = '1994-11-15'
FOR UPDATE OF LastName

OPEN EMP_CURSOR

FETCH NEXT FROM EMP_CURSOR 

UPDATE EMPLOYEES
SET LastName = LastName + CAST(DatePart(ms,GetDate()) as char(3))
WHERE CURRENT OF EMP_CURSOR


CLOSE EMP_CURSOR

DEALLOCATE  EMP_CURSOR