Переменные таблицы с псевдонимом в команде "Удалить из заявления"

Я хочу удалить строки из табличной переменной SQL Server 2000/2005 на основе наличия других строк в одной таблице (удалите все 0 строк подсчета, если существует строка счисления non-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 (и я думаю, что псевдоним требуется из-за имен "o1.Month = o2.Month" ). Ошибка:

Msg 102, уровень 15, состояние 1, строка 11

Неправильный синтаксис около 'o1'.

Ответ 1

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

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

Ответ 2

Попробуйте это, он должен работать (первый 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, подзапрос и т.д.