2012-06-12 13 views
92

W SQL Server Compact Edition w Visual Studio 2010 (może SQL Server i SQL w ogóle, ja nie wiem), polecenie to działa:Dlaczego nie mogę użyć aliasu w instrukcji DELETE?

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

@ aaron-bertrand Dzięki za poprawienie mojego tytułu. Nie zdawałem sobie sprawy z tego, co napisałem (inaczej Google mógł to szybko rozwiązać). Jeszcze raz dziękuję. –

+0

Bez obaw. Po prostu staram się to wyjaśnić innym czytelnikom. –

+0

Zgadzam się z tobą, ponieważ różnice w składni różnych poleceń są czasami mało intuicyjne. –

Odpowiedz

148

aby aliasu tabeli trzeba by powiedzieć:

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

ja nie widzę sensu aliasing na ten specyficzny DELETE oświadczenie, zwłaszcza, że ​​(przynajmniej IIRC) nie jest już zgodne ze ścisłym ANSI. Ale tak, jak sugerują komentarze, może być konieczne dla innych formularzy zapytań (np. Korelacji).

+0

Byłem po prostu ciekawy, ponieważ normalnie używaj aliasów podczas używania 'SELECT' i innych takich stwierdzeń, więc instynktownie zrobiłem to, do czego jestem przyzwyczajony i zastanawiałem się, dlaczego to nie działa poprawnie. –

+28

+1 W przypadku OP aliasing może nie być potrzebny, ale było mi pomocne, ponieważ używałem klauzuli EXISTS, więc musiałem aliasować tabelę, aby móc połączyć oba zapytania razem. – Ricardo

+4

Szukałem rozwiązania, gdy wziąłem istniejące zapytanie SELECT i zamieniłem je w instrukcję DELETE szybko, bez konieczności przepisywania aliasingu. – Alex

52

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

DELETE f FROM foods f WHERE (f.name IN ('chickens', 'rabbits')) 
+3

+1 Pomocny jak inna odpowiedź ... – Ricardo

+1

@Ricardo tylko różnica jest schematem, ale czas sugeruje, że oba zostały wysłane w tym samym czasie. – Mukus

Powiązane problemy