2009-02-28 5 views
40

Desidero eliminare le righe da una variabile di tabella di SQL Server 2000/2005 in base alla presenza di altre righe nella stessa tabella (eliminare tutte le righe di conteggio 0 se un conteggio non 0 la riga esiste con la stessa data). Ecco un esempio semplificato che dovrebbe eliminare solo la riga aggiunta per prima:Variabili tabella con un alias in un'istruzione Elimina da

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) 

Il problema è che non riesco a SQL server per accettare alias o1 della variabile di tabella (e penso che un alias è necessaria a causa della "o1.Month = o2.Month" corrispondenti ai nomi dei campi). L'errore è:

Msg 102, livello 15, stato 1, riga 11

la sintassi non corretta in prossimità 'o1'.

risposta

52

Specificare il nome dell'alias prima DA dichiarazione Significato, si elimina dalla tabella alias.

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) 


Risultato

alt text

+0

Wow, non sapevo su questa sintassi! Se non avessi incollato l'immagine, l'avrei rifiutata come non valida. Funziona su SQL2000 o solo su SQL Server 2005? Sono a casa ora, quindi non posso verificare direttamente. –

+0

Dovrebbe funzionare su SQL 2k/2k5/2k8 (è stato testato su 2k8 sullo screenshot) - Non ha mai avuto a che fare con SQL 7 quindi non sono sicuro di 7 – Sung

8

Prova questo, dovrebbe funzionare (il primo dal opzionale):

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) 

La logica è: DELETE, come spiegato here, si aspetta una tabella senza alias t, un FROM opzionale può precederlo. Dopo di che si può mettere un alias su un tavolo nel secondo da, se è necessario fare un JOIN, subquery, ecc.