web-dev-qa-db-ja.com

Delete Fromステートメントにエイリアスを持つテーブル変数

同じテーブル内の他の行の存在に基づいて、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'付近の構文が正しくありません。

41
Anagoge

[〜#〜] 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

52
dance2die

これを試してください、それはうまくいくはずです(最初の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でテーブルにエイリアスを設定できます。

8
Joe Pineda