Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Table Variables with an Alias in a Delete From Statement

I want to delete rows from a SQL Server 2000/2005 table variable based on the presence of other rows in the same table (delete all 0 count rows if a non-0 count row exists with the same date). Here is a simplified example that should only delete the row added first:

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) 

The problem is that I can't get SQL server to accept the table variable's o1 alias (and I think an alias is required due to the "o1.Month = o2.Month" matching field names). The error is:

Msg 102, Level 15, State 1, Line 11

Incorrect syntax near 'o1'.

like image 941
Anagoge Avatar asked Feb 28 '09 04:02

Anagoge


People also ask

Can we use alias in delete query?

Recently I wrote about the myth that you can't use an alias in an UPDATE statement. You can of course, and the trick is to make sure that the alias is used in the FROM clause of the statement.

Can I truncate a table variable?

No, you cannot TRUNCATE a table variable since it is not a physical table.


1 Answers

Specify the alias name before FROM statement Meaning, you are deleting from the aliased table.

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) 


Result

alt text

like image 126
dance2die Avatar answered Sep 21 '22 09:09

dance2die