2009-02-28 16 views
40

Chcę usunąć wiersze ze zmiennej tabelowej SQL Server 2000/2005 na podstawie obecności innych wierszy w tej samej tabeli (usunąć wszystkie wiersze zliczania 0, jeśli nie ma zliczeń 0; wiersz istnieje z tą samą datą). Oto uproszczony przykład, że należy usuwać tylko wiersz najpierw dodaje:Zmienne tabelowe z aliasem w instrukcji usuwania z kolekcji

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) 

Problem polega na tym, że nie mogę dostać serwera SQL do zaakceptowania zmiennej stołu o1 aliasu (i myślę, że alias jest wymagana ze względu na "o1.Month = o2.Month" pasujące nazwy pól). Błąd jest:

Msg 102, Level 15, State 1, wiersz 11

Niepoprawna składnia w pobliżu 'O1'.

Odpowiedz

52

Określ nazwę aliasu przed OD oświadczenie znaczenie, usuwasz z aliasing tabeli.

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) 


Wynik

alt text

+0

Wow, nie wiedziałem o tej składni! Gdyby nie wkleiłeś obrazu, odrzuciłbym go jako nieważny. Czy to działa na SQL2000 lub tylko na SQL Server 2005? Jestem teraz w domu, więc nie mogę bezpośrednio zweryfikować. –

+0

Powinien działać na SQL 2k/2k5/2k8 (testowano go na 2k8 na zrzucie ekranu) - Nigdy nie zajmowałem się SQL 7, więc nie jestem pewien 7 – Sung

8

Spróbuj tego, to powinien działać (pierwszy OD jest opcjonalny):

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) 

Uzasadnieniem jest: DELETE, jak wyjaśnił here, spodziewa się, że nie będzie aliasingu w tabeli t, opcjonalny FROM może go poprzedzać. Potem możesz umieścić alias na stole w drugim FROM, jeśli potrzebujesz zrobić JOIN, podzapytanie, itp.

Powiązane problemy