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

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


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

1
@Ricardo jedyną różnicą jest schemat. Ale czas sugeruje, że oba zostały opublikowane w tym samym czasie.
— Mukus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.