Табличные переменные с псевдонимом в операторе удаления из - PullRequest
41 голосов
/ 28 февраля 2009

Я хочу удалить строки из табличной переменной SQL Server 2000/2005 на основе наличия других строк в той же таблице (удалить все строки с 0 счетами, если существует строка с не 0 счетом с той же датой). Вот упрощенный пример, который должен удалять только строку, добавленную первой:

declare @O table (
    Month datetime,
    ACount int NULL
)

insert into @O values ('2009-01-01', 0)
insert into @O values ('2009-01-01', 1)
insert into @O values ('2008-01-01', 1)
insert into @O values ('2007-01-01', 0)

delete from @O o1
where ACount = 0
  and exists (select Month from @O o2 where o1.Month = o2.Month and o2.ACount > 0)

Проблема в том, что я не могу заставить сервер SQL принимать псевдоним o1 табличной переменной (и я думаю, что псевдоним необходим из-за "o1.Month = o2.Month" совпадающих имен полей). Ошибка:

Сообщение 102, Уровень 15, Состояние 1, Строка 11

Неверный синтаксис рядом с 'o1'.

Ответы [ 2 ]

52 голосов
/ 28 февраля 2009

Укажите псевдоним перед оператором FROM Это означает, что вы удаляете из таблицы псевдонимов.

delete o1
from   @O as o1
where  ACount = 0 
       and exists ( select  Month 
                    from    @O o2 
                    where   o1.Month = o2.Month 
                            and o2.ACount > 0)


Результат

alt text

8 голосов
/ 28 февраля 2009

Попробуйте, это должно работать (первый FROM не обязателен):

DELETE [FROM] @O
FROM @O o1
where ACount = 0
and exists (select Month from @O o2
      where o1.Month = o2.Month and o2.ACount > 0)

Обоснование: DELETE, как объяснено здесь , сначала ожидает таблицу без псевдонимов, перед ней может предшествовать необязательный FROM. После этого вы можете поместить псевдоним в таблицу во втором FROM, если вам нужно выполнить JOIN, подзапрос и т. Д.

...