DELETEステートメントでエイリアスを使用できないのはなぜですか?


158

Visual Studio 2010のSQL Server Compact Edition(多分SQL ServerとSQLは一般的に知りません)では、次のコマンドが機能します。

DELETE FROM foods WHERE (name IN ('chickens', 'rabbits'))

しかし、このコマンドは次のエラーを生成します: Error near identifier f. Expecting OUTPUT.

DELETE FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))

@ aaron-bertrandタイトルも訂正してくれてありがとう。私は自分が投稿したものの正しい用語を理解していませんでした(そうでなければ、グーグルはすぐにこれを解決できただろう)。ありがとうございました。
Ricardo Altamirano

心配ない。他の読者のためにそれを明確にしようとしているだけです。
アーロンバートランド

異なるコマンド間での構文の違いは、時には直感的でないという点で、私はあなたに同意します。
アーロンベルトラン

ここに同じ質問だが、UPDATE文について:stackoverflow.com/questions/31551/...
ダニエル・ニール

回答:


239

テーブルにエイリアスを付けるには、次のように言う必要があります。

DELETE f FROM dbo.foods AS f WHERE f.name IN (...);

DELETE特に(少なくともIIRC)これは厳密なANSIに準拠していないため、この特定のステートメントのエイリアスのポイントはわかりません。しかし、はい、コメントが示唆するように、他のクエリフォーム(たとえば、相関)には必要になる場合があります。


2
私は主に気になるだけでした。なぜなら、通常SELECT、そのようなステートメントを使用するときはエイリアスを使用するからです。
Ricardo Altamirano

41
+1 OPの場合、エイリアスは必要ないかもしれませんが、EXISTS句を使用していたので役に立ちました。両方のクエリを結合できるようにテーブルにエイリアスを設定する必要がありました。
Ricardo

4
既存のSELECTクエリを取得し、エイリアスを書き換えることなくすばやくDELETEステートメントに変換するときの解決策を探していました。
アレックス

4
これが重要なユースケースの例。複数の列が含まれている(つまり、機能するinか機能not inしない)2番目のテーブルの内容に基づいて削除:DELETE f from dbo.foods as f where not exists (select top 1 1 from animalDiets a where a.AnimalId = f.AnimalId and a.DietId = f.DietId)
JohnLBevan

3
エイリアスを使用した削除は、テーブルから削除したいが、行の数を減らすためにそのテーブルを他のテーブル/ビューに結合する必要がある場合に役立ちます。例えばdelete o from Order as o inner join Customer as c on c.CustomerID = o.CustomerID where c.ArchiveOrders = 1
アンドリューイェンス

74

deleteステートメントの構文が奇妙です。こんなふうになります:

DELETE f FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))

1
@Ricardoの唯一の違いはスキーマです。しかし、当時は両方が同時に投稿されたことを示唆しています。
ムクス、2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.