同じテーブル内の他の行の存在に基づいて、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サーバーがテーブル変数のo1エイリアスを受け入れることができないことです(そして、「o1.Month = o2.Month
"一致するフィールド名)。エラーは次のとおりです:
メッセージ102、レベル15、状態1、行11
'o1'付近の構文が正しくありません。
[〜#〜] 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)
結果
これを試してください、それはうまくいくはずです(最初の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 の場合、最初に非エイリアステーブルを想定し、オプションのFROMをその前に置くことができます。その後、JOIN、サブクエリなどを実行する必要がある場合は、2番目のFROMでテーブルにエイリアスを設定できます。