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

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


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

1
@ Ricardo einziger Unterschied ist das Schema. Die Zeit deutet jedoch darauf hin, dass beide gleichzeitig veröffentlicht wurden.
Mukus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.