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.