Pourquoi ne puis-je pas utiliser un alias dans une instruction DELETE?

158

Dans SQL Server Compact Edition dans Visual Studio 2010 (peut-être SQL Server et SQL en général, je ne sais pas), cette commande fonctionne:

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

mais cette commande produit une erreur de: Error near identifier f. Expecting OUTPUT.

DELETE FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))
Ricardo Altamirano
la source
@ aaron-bertrand Merci d'avoir corrigé mon titre également. Je n'ai pas réalisé le terme correct pour ce que j'ai publié (sinon, Google aurait pu résoudre ce problème rapidement). Merci encore.
Ricardo Altamirano
Pas de soucis. J'essaie juste de le rendre clair pour les autres lecteurs.
Aaron Bertrand
Je suis d'accord avec vous sur le fait que les variations de syntaxe entre les différentes commandes sont parfois un peu peu intuitives.
Aaron Bertrand
Voici la même question, mais pour les déclarations UPDATE: stackoverflow.com/questions/31551/…
Daniel Neel

Réponses:

239

Pour aliaser la table, vous devez dire:

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

Je ne vois pas l'intérêt de l'alias pour cette DELETEdéclaration spécifique , d'autant plus que (au moins IIRC) cela n'est plus conforme à ANSI strict. Mais oui, comme le suggèrent les commentaires, cela peut être nécessaire pour d'autres formulaires de requête (par exemple la corrélation).

Aaron Bertrand
la source
2
J'étais principalement curieux, car j'utilise normalement des alias lors de l'utilisation SELECTet d'autres déclarations de ce type, alors j'ai instinctivement fait ce à quoi j'étais habitué et je me demandais pourquoi cela ne fonctionnait pas correctement.
Ricardo Altamirano
41
+1 Dans le cas de l'OP, l'aliasing n'est peut-être pas nécessaire, mais cela m'a été utile car j'utilisais une clause EXISTS, j'ai donc dû alias la table pour pouvoir lier les deux requêtes ensemble.
Ricardo
4
Je cherchais une solution en prenant une requête SELECT existante et en la transformant rapidement en instruction DELETE sans avoir à réécrire l'alias.
Alex
4
Exemple de cas d'utilisation où cela est important; suppression basée sur le contenu d'une deuxième table où il y a plusieurs colonnes impliquées (c'est-à-dire que cela fonctionnera inou not inne fonctionnerait pas: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
La suppression avec un alias est utile lorsque vous souhaitez supprimer d'une table, mais devez joindre cette table à d'autres tables / vues pour obtenir un ensemble réduit de lignes. Par exempledelete o from Order as o inner join Customer as c on c.CustomerID = o.CustomerID where c.ArchiveOrders = 1
Andrew Jens
74

L'instruction delete a une syntaxe étrange. Ça va comme ça:

DELETE f FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))
usr
la source
1
@Ricardo seule différence est le schéma. Mais l'heure suggère que les deux ont été affichés en même temps.
Mukus