Dlaczego nie mogę użyć aliasu w instrukcji DELETE?

158

W SQL Server Compact Edition w Visual Studio 2010 (może SQL Server i ogólnie SQL, nie wiem), to polecenie działa:

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

ale to polecenie powoduje błąd: Error near identifier f. Expecting OUTPUT.

DELETE FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))
Ricardo Altamirano
źródło
@ aaron-bertrand Dziękuję również za poprawienie mojego tytułu. Nie zdawałem sobie sprawy z właściwego terminu dla tego, co opublikowałem (w przeciwnym razie Google mógłby to szybko rozwiązać). Jeszcze raz dziękuję.
Ricardo Altamirano
Bez obaw. Po prostu próbuję wyjaśnić to innym czytelnikom.
Aaron Bertrand
Zgadzam się z tobą, jeśli chodzi o to, że różnice w składni między różnymi poleceniami są czasami trochę nieintuicyjne.
Aaron Bertrand
Oto to samo pytanie, ale dla instrukcji UPDATE: stackoverflow.com/questions/31551/…
Daniel Neel

Odpowiedzi:

239

Aby utworzyć alias tabeli, musisz powiedzieć:

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

Nie widzę sensu tworzenia aliasów dla tego konkretnego DELETEstwierdzenia, zwłaszcza że (przynajmniej IIRC) nie jest ono już zgodne ze ścisłymi normami ANSI. Ale tak, jak sugerują komentarze, może być konieczne w przypadku innych formularzy zapytań (np. Korelacja).

Aaron Bertrand
źródło
2
Byłem głównie zaciekawiony, ponieważ normalnie używam aliasów podczas używania SELECTi innych takich stwierdzeń, więc instynktownie zrobiłem to, do czego jestem przyzwyczajony i zastanawiałem się, dlaczego nie działa poprawnie.
Ricardo Altamirano
41
+1 W przypadku OP aliasing może nie być potrzebny, ale był dla mnie pomocny, ponieważ użyłem klauzuli EXISTS, więc musiałem aliasować tabelę, aby móc powiązać oba zapytania razem.
Ricardo
4
Szukałem rozwiązania, biorąc istniejące zapytanie SELECT i szybko zmieniając je w instrukcję DELETE bez konieczności przepisywania aliasingu.
Alex
4
Przykład przypadku użycia, w którym jest to ważne; usuwanie na podstawie zawartości drugiej tabeli, w której jest zaangażowanych wiele kolumn (tj. tak inlub not innie działa: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
Usuwanie za pomocą aliasu jest przydatne, gdy chcesz usunąć z tabeli, ale musisz połączyć tę tabelę z innymi tabelami / widokami, aby uzyskać zmniejszony zestaw wierszy. Np.delete o from Order as o inner join Customer as c on c.CustomerID = o.CustomerID where c.ArchiveOrders = 1
Andrew Jens
74

Instrukcja delete ma dziwną składnię. To wygląda tak:

DELETE f FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))
usr
źródło
1
@Ricardo jedyną różnicą jest schemat. Ale czas sugeruje, że oba zostały opublikowane w tym samym czasie.
Mukus