2009-02-28 20 views
40

同じテーブル内の他の行の存在に基づいてSQL Server 2000/2005テーブル変数から行を削除したい(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")。エラーは次のとおりです。

メッセージ102、レベル15、状態1、行11

付近に正しくない構文 '01'。

答えて

52

あなたはエイリアステーブルから削除され、声明 意味から前にエイリアス名を指定します。

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でのみ動作しますか?私は今家にいますので、直接確認することはできません。 –

+0

これはSQL 2k/2k5/2k8(スクリーンショットでは2k8でテスト済み)で動作するはずです。 – 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オプションのFROMを前に付けることができます。その後、JOIN、サブクエリなどを行う必要がある場合は、2番目のFROMのテーブルにエイリアスを置くことができます。

関連する問題