¿Por qué no puedo usar un alias en una declaración DELETE?

158

En SQL Server Compact Edition en Visual Studio 2010 (quizás SQL Server y SQL en general, no lo sé), este comando funciona:

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

pero este comando produce un error de: Error near identifier f. Expecting OUTPUT.

DELETE FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))
Ricardo Altamirano
fuente
@ aaron-bertrand Gracias por corregir mi título también. No me di cuenta del término correcto para lo que publiqué (de lo contrario, Google podría haber resuelto esto rápidamente). Gracias de nuevo.
Ricardo Altamirano
Sin preocupaciones. Solo trato de dejarlo claro para otros lectores.
Aaron Bertrand
Estoy de acuerdo con usted en la forma en que las variaciones de sintaxis entre los diferentes comandos a veces son poco intuitivas.
Aaron Bertrand
Aquí está la misma pregunta, pero para las declaraciones de ACTUALIZACIÓN: stackoverflow.com/questions/31551/…
Daniel Neel

Respuestas:

239

Para alias de la tabla, tendrías que decir:

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

No veo el punto de alias para esta DELETEdeclaración específica , especialmente porque (al menos IIRC) esto ya no se ajusta al estricto ANSI. Pero sí, como sugieren los comentarios, puede ser necesario para otros formularios de consulta (por ejemplo, correlación).

Aaron Bertrand
fuente
2
Principalmente tenía curiosidad, porque normalmente uso alias cuando uso SELECTy otras declaraciones similares, así que instintivamente hice lo que estaba acostumbrado y me preguntaba por qué no funcionó correctamente.
Ricardo Altamirano
41
+1 En el caso del OP, puede que no sea necesario el aliasing, pero fue útil para mí porque estaba usando una cláusula EXISTS, por lo que tuve que alias la tabla para poder unir ambas consultas.
Ricardo
44
Estaba buscando una solución al tomar una consulta SELECT existente y convertirla en una declaración DELETE rápidamente sin tener que volver a escribir el alias.
Alex
44
Ejemplo de un caso de uso donde esto es importante; eliminación basada en el contenido de una segunda tabla donde hay múltiples columnas involucradas (es decir, si funciona ino not inno: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 eliminación con un alias es útil cuando desea eliminar de una tabla pero necesita unir esa tabla a otras tablas / vistas para obtener un conjunto reducido de filas. Por ejemplodelete o from Order as o inner join Customer as c on c.CustomerID = o.CustomerID where c.ArchiveOrders = 1
Andrew Jens el
74

La declaración de eliminación tiene una sintaxis extraña. Dice así:

DELETE f FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))
usr
fuente
1
La única diferencia de @Ricardo es el esquema. Pero el tiempo sugiere que ambos fueron publicados al mismo tiempo.
Mukus