我有两张桌子:
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; =或子查询用作表达式时,不允许这样做。 声明已经终止。
答案 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)
此子句期望标量值,并且您提供表值。