Perché non posso usare un alias in un'istruzione DELETE?


158

In SQL Server Compact Edition in Visual Studio 2010 (forse SQL Server e SQL in generale, non lo so), questo comando funziona:

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

ma questo comando produce un errore di: Error near identifier f. Expecting OUTPUT.

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

@ aaron-bertrand Grazie per aver corretto anche il mio titolo. Non ho realizzato il termine corretto per quello che ho pubblicato (altrimenti Google avrebbe potuto risolverlo rapidamente). Grazie ancora.
— Ricardo Altamirano,

Nessun problema. Sto solo cercando di chiarire gli altri lettori.
— Aaron Bertrand,

Sono d'accordo con te per il fatto che le variazioni di sintassi tra comandi diversi a volte sono poco intuitive.
— Aaron Bertrand,

Ecco la stessa domanda, ma per le dichiarazioni di AGGIORNAMENTO: stackoverflow.com/questions/31551/…
— Daniel Neel,

Risposte:


239

Per alias la tabella dovresti dire:

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

Non riesco a vedere il punto di aliasing per questa specifica DELETEaffermazione, soprattutto perché (almeno IIRC) questo non è più conforme al rigoroso ANSI. Sì, come suggeriscono i commenti, potrebbe essere necessario per altri moduli di query (ad es. Correlazione).


2
Ero principalmente solo curioso, perché normalmente uso gli alias quando uso SELECTe altre dichiarazioni simili, quindi ho istintivamente fatto quello a cui sono abituato e mi chiedevo perché non funzionasse correttamente.
— Ricardo Altamirano,

41
+1 Nel caso del PO, l'aliasing potrebbe non essere necessario, ma mi è stato utile perché stavo usando una clausola EXISTS, quindi ho dovuto aliasare la tabella in modo da poter collegare entrambe le query.
— Ricardo,

4
Stavo cercando una soluzione quando prendevo una query SELECT esistente e la trasformavo rapidamente in un'istruzione DELETE senza dover riscrivere l'aliasing.
— Alex,

4
Esempio di un caso d'uso in cui questo è importante; eliminazione in base al contenuto di una seconda tabella in cui sono coinvolte più colonne (vale a dire ino not innon funzionerebbe: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
L'eliminazione con un alias è utile quando si desidera eliminare da una tabella ma è necessario unire quella tabella ad altre tabelle / viste per ottenere un set ridotto di righe. Ad esempiodelete o from Order as o inner join Customer as c on c.CustomerID = o.CustomerID where c.ArchiveOrders = 1
— Andrew Jens,

74

L'istruzione delete ha strana sintassi. Va così:

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

1
@Ricardo l'unica differenza è lo schema. Ma il tempo suggerisce che entrambi sono stati pubblicati contemporaneamente.
— Mukus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.