Por que não consigo usar um alias em uma instrução DELETE?

158

No SQL Server Compact Edition no Visual Studio 2010 (talvez SQL Server e SQL em geral, eu não sei), este comando funciona:

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

mas este comando produz um erro de: Error near identifier f. Expecting OUTPUT.

DELETE FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))
Ricardo Altamirano
fonte
@ Aaron-Bertrand Obrigado por corrigir meu título também. Não percebi o termo correto para o que postei (caso contrário, o Google poderia ter resolvido isso rapidamente). Mais uma vez obrigado.
Ricardo Altamirano
Não se preocupe. Apenas tentando deixar claro para outros leitores.
Aaron Bertrand
Eu concordo com você pela maneira como as variações de sintaxe entre diferentes comandos são um pouco pouco intuitivas às vezes.
Aaron Bertrand
Aqui está a mesma pergunta, mas para as instruções UPDATE: stackoverflow.com/questions/31551/…
Daniel Neel

Respostas:

239

Para alternar a tabela, você teria que dizer:

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

Não vejo o ponto de alias para esta DELETEdeclaração específica , especialmente porque (pelo menos IIRC) isso não está mais em conformidade com o ANSI estrito. Mas sim, como sugerem os comentários, pode ser necessário para outros formulários de consulta (por exemplo, correlação).

Aaron Bertrand
fonte
2
Eu estava principalmente curioso, porque normalmente uso pseudônimos ao usar SELECTe outras declarações desse tipo, então instintivamente fiz o que estava acostumado e me perguntei por que não funcionou corretamente.
Ricardo Altamirano
41
+1 No caso do OP, o aliasing pode não ser necessário, mas foi útil para mim porque eu estava usando uma cláusula EXISTS, então tive que usar o alias da tabela para poder vincular as duas consultas.
Ricardo Ricardo
4
Eu estava procurando uma solução ao pegar uma consulta SELECT existente e transformá-la em uma instrução DELETE rapidamente, sem precisar reescrever o alias.
1955 Alex
4
Exemplo de um caso de uso em que isso é importante; exclusão com base no conteúdo de uma segunda tabela em que há várias colunas envolvidas (ou seja, funciona inou not innão: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 20/16/16
3
A exclusão com um alias é útil quando você deseja excluir de uma tabela, mas precisa associá-la a outras tabelas / visualizações para obter um conjunto reduzido de linhas. Por exemplodelete o from Order as o inner join Customer as c on c.CustomerID = o.CustomerID where c.ArchiveOrders = 1
Andrew Jens
74

A instrução delete tem uma sintaxe estranha. É assim:

DELETE f FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))
usr
fonte
1
@ Ricardo única diferença é o esquema. Mas o horário sugere que ambos foram publicados ao mesmo tempo.
Mukus 14/03