2009-02-28 69 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服務器接受該表變量的01別名(我認爲一個別名,需要因「o1.Month = o2.Month」匹配字段名稱)。錯誤是:

消息102,15級,狀態1,11號線

附近有語法錯誤 '01'。

回答

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

哇,不知道這個語法!如果你沒有粘貼圖片,我會拒絕它作爲無效。這是否適用於SQL2000或僅適用於SQL Server 2005?我現在在家,所以無法直接驗證。 – 2009-02-28 05:28:44

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,期望一個沒有別名的表冷杉t,一個可選的FROM可以在它之前。之後,你可以在第二個FROM的表中放置一個別名,如果你需要做一個JOIN,子查詢等。