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'))

@ 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).


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'))

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.