Проблема с оператором Update в T-SQL - PullRequest
2 голосов
/ 07 сентября 2011

У меня есть две таблицы:

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, у которых нет записей в таблице QUEUE с QueueStatus <4. И этот запрос сводит меня с ума! </p>

Вот что я пробовал:

    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 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения. Заявление было прекращено.

Ответы [ 3 ]

2 голосов
/ 07 сентября 2011

Если я вас правильно понял, это должно сработать:

UPDATE
  Task
SET 
  SysTaskStatus = 3
WHERE
  NOT EXISTS (SELECT * FROM TaskQueue WHERE QueueStatus < 4 AND Task.SysTask = TaskQueue.SysTask)
2 голосов
/ 07 сентября 2011

Возможно, вам нужно изменить предложение WHERE, например

WHERE {NOT} EXISTS (SELECT ... )

вместо

WHERE {0} = (SELECT ... )

, это будет намного лучше и быстрее

0 голосов
/ 07 сентября 2011
WHERE 0 = (SELECT SysTask FROM [dbo].[TaskQueue] WHERE Task.[SysTask] = SysTask AND [SysTaskQueueStatus] < 4)

это предложение ожидает скалярное значение, а вы предоставляете табличное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...