2009-02-28 2 views
40

Я хочу удалить строки из табличной переменной 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" соответствующие имена полей). Ошибка:

Msg 102, Level 15, State 1, Line 11

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

ответ

52

Укажите имя псевдонима, прежде чем 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

+0

Wow, не знал об этом синтаксисе! Если бы вы не вставили изображение, я бы отклонил его как недействительный. Это работает на SQL2000 или только на SQL Server 2005? Я сейчас дома, поэтому я не могу подтвердить это напрямую. –

+0

Он должен работать на SQL 2k/2k5/2k8 (он был протестирован на 2k8 на скриншоте) - Никогда не занимался SQL 7, поэтому не был уверен в 7 – Sung

8

Попробуйте это, он должен работать (первое 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, а объяснил here, ожидает, что нетипизированная таблица firs t, перед ним может быть необязательный FROM. После этого вы можете поместить псевдоним на стол во втором FROM, если вам нужно сделать JOIN, подзапрос и т. Д.

Смежные вопросы