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

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


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

1
@ Ricardo única diferença é o esquema. Mas o horário sugere que ambos foram publicados ao mesmo tempo.
— Mukus 14/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.