Warum kann ich in einer DELETE-Anweisung keinen Alias ​​verwenden?

158

In SQL Server Compact Edition in Visual Studio 2010 (möglicherweise SQL Server und SQL im Allgemeinen, ich weiß es nicht) funktioniert dieser Befehl:

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

Dieser Befehl erzeugt jedoch einen Fehler von: Error near identifier f. Expecting OUTPUT.

DELETE FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))
Ricardo Altamirano
quelle
@ aaron-bertrand Danke, dass du auch meinen Titel korrigiert hast. Ich habe den richtigen Begriff für das, was ich gepostet habe, nicht erkannt (andernfalls hätte Google dies schnell beheben können). Danke nochmal.
Ricardo Altamirano
Keine Sorge. Ich versuche nur, es anderen Lesern klar zu machen.
Aaron Bertrand
Ich stimme Ihnen darin zu, dass die Syntaxvariationen zwischen verschiedenen Befehlen manchmal etwas unintuitiv sind.
Aaron Bertrand
Hier ist die gleiche Frage, aber für UPDATE-Anweisungen: stackoverflow.com/questions/31551/…
Daniel Neel

Antworten:

239

Um die Tabelle zu aliasen, müssten Sie sagen:

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

Ich sehe DELETEkeinen Sinn für Aliasing für diese spezifische Aussage, zumal dies (zumindest IIRC) nicht mehr der strengen ANSI entspricht. Aber ja, wie Kommentare vermuten lassen, kann dies für andere Abfrageformulare erforderlich sein (z. B. Korrelation).

Aaron Bertrand
quelle
2
Ich war hauptsächlich nur neugierig, weil ich normalerweise Aliase verwende, wenn ich SELECTsolche und andere Aussagen verwende, also habe ich instinktiv getan, was ich gewohnt bin, und mich gefragt, warum es nicht richtig funktioniert hat.
Ricardo Altamirano
41
+1 Im Fall des OP ist Aliasing möglicherweise nicht erforderlich, aber es war hilfreich für mich, da ich eine EXISTS-Klausel verwendete, sodass ich die Tabelle aliasen musste, damit ich beide Abfragen miteinander verknüpfen konnte.
Ricardo
4
Ich suchte nach einer Lösung, als ich eine vorhandene SELECT-Abfrage schnell in eine DELETE-Anweisung umwandelte, ohne das Aliasing neu schreiben zu müssen.
Alex
4
Beispiel eines Anwendungsfalls, bei dem dies wichtig ist; Löschen basierend auf dem Inhalt einer zweiten Tabelle, in der mehrere Spalten enthalten sind (dh so inoder not innicht funktionieren würden: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
Das Löschen mit einem Alias ​​ist nützlich, wenn Sie aus einer Tabelle löschen möchten, diese Tabelle jedoch mit anderen Tabellen / Ansichten verknüpfen müssen, um eine reduzierte Anzahl von Zeilen zu erhalten. ZBdelete o from Order as o inner join Customer as c on c.CustomerID = o.CustomerID where c.ArchiveOrders = 1
Andrew Jens
74

Die delete-Anweisung hat eine seltsame Syntax. Es geht so:

DELETE f FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))
usr
quelle
1
@ Ricardo einziger Unterschied ist das Schema. Die Zeit deutet jedoch darauf hin, dass beide gleichzeitig veröffentlicht wurden.
Mukus