T-SQL中的Update语句问题

时间:2011-09-07 12:35:05

标签: sql sql-server sql-server-2008

我有两张桌子:

CREATE TABLE [dbo].[Task](
    [SysTask] [int] IDENTITY(1,1) NOT NULL,
    [TaskStatus] [int] NOT NULL,
)

CREATE TABLE [dbo].[Queue](
    [SysQueue] [int] IDENTITY(1,1) NOT NULL,
    [SysTask] [int] NOT NULL,
    [QueueStatus] [int] NOT NULL,
)

一个TASK有很多队列记录。我知道这些名字有点令人困惑。 我需要更新表TASK中的所有记录,这些记录在表QUEUE中没有记录,QueueStatus<这个查询让我抓狂!

这是我尝试过的:

    UPDATE Task SET SysTaskStatus = 3
        WHERE SysTaskStatus <> 3 AND [SysTask] NOT IN ((SELECT tq.SysTask FROM [dbo].[TaskQueue] tq WHERE [SysTask] = tq.SysTask AND tq.[SysTaskQueueStatus] IN (1,2,3)))

    UPDATE Task SET SysTaskStatus = 3
        WHERE EXISTS (SELECT 1 FROM [dbo].[TaskQueue] WHERE Task.[SysTask] = [SysTask] AND [SysTaskQueueStatus] <4 HAVING COUNT(*)=0)

    UPDATE Task SET SysTaskStatus = 3 
        WHERE 0 = (SELECT SysTask FROM [dbo].[TaskQueue] WHERE Task.[SysTask] = SysTask AND [SysTaskQueueStatus] < 4)

对于所有这些查询,始终存在相同的错误:

  

子查询返回的值超过1。当子查询遵循=,!=,&lt;,&lt; =,&gt;,&gt; =或子查询用作表达式时,不允许这样做。   声明已经终止。

3 个答案:

答案 0 :(得分:2)

也许您需要更改像

这样的WHERE子句
WHERE {NOT} EXISTS (SELECT ... )

而不是

WHERE {0} = (SELECT ... )

它会更好更快

答案 1 :(得分:2)

如果我理解正确的话,这应该可以解决问题:

UPDATE
  Task
SET 
  SysTaskStatus = 3
WHERE
  NOT EXISTS (SELECT * FROM TaskQueue WHERE QueueStatus < 4 AND Task.SysTask = TaskQueue.SysTask)

答案 2 :(得分:0)

WHERE 0 = (SELECT SysTask FROM [dbo].[TaskQueue] WHERE Task.[SysTask] = SysTask AND [SysTaskQueueStatus] < 4)

此子句期望标量值,并且您提供表值。