41

同じテーブル内の他の行の存在に基づいて、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)

o1.Month = o2.Month問題は、テーブル変数の o1 エイリアスを SQL サーバーに受け入れさせることができないことです (フィールド名が " " 一致するため、エイリアスが必要だと思います)。エラーは次のとおりです。

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

'o1' 付近の構文が正しくありません。

4

2 に答える 2

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)


結果

代替テキスト

于 2009-02-28T05:05:40.520 に答える
9

これを試してください、それは動作するはずです(最初の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は、エイリアスのないテーブルを最初に予期します。オプションのFROMをその前に置くことができます。その後、JOINやサブクエリなどを実行する必要がある場合は、2番目のFROMのテーブルにエイリアスを配置できます。

于 2009-02-28T05:09:18.717 に答える