Чому я не можу використовувати псевдонім у виписці DELETE?


158

У компактному виданні SQL Server у Visual Studio 2010 (можливо, SQL Server і взагалі SQL, я не знаю), ця команда працює:

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

але ця команда створює помилку: Error near identifier f. Expecting OUTPUT.

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

@ aaron-bertrand Дякую за те, що виправив мій титул. Я не усвідомив правильний термін для публікації, який я розмістив (інакше Google міг би вирішити це швидко). Ще раз дякую вам.
Рікардо Альтамірано

Не хвилюйтесь. Просто намагаюся зробити це зрозумілим для інших читачів.
Аарон Бертран

Я згоден з вами тим, що варіації синтаксису між різними командами часом мало інтуїтивні.
Аарон Бертран

Ось те саме запитання, але щодо тверджень UPDATE: stackoverflow.com/questions/31551/…
Daniel Neel

Відповіді:


239

Для отримання псевдоніму таблиці ви повинні сказати:

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

Я не бачу сенсу псевдоніму для цього конкретного DELETEтвердження, тим більше, що (принаймні IIRC) це більше не відповідає суворій ANSI. Але так, як підказують коментарі, це може знадобитися для інших форм запитів (наприклад, кореляція).


2
Мені в основному було просто цікаво, тому що я зазвичай використовую псевдоніми під час використання SELECTта інших таких висловлювань, тому інстинктивно робив те, до чого звик, і цікавився, чому це не працює належним чином.
Рікардо Альтамірано

41
+1 У випадку з ОП, псевдонім може не знадобитися, але мені це було корисно, оскільки я використовував пункт EXISTS, тому мені довелося псевдонімити таблицю, щоб я міг зв'язати обидва запити разом.
Рікардо

4
Я шукав рішення, коли брав існуючий запит SELECT і швидко перетворював його на операцію DELETE, не потребуючи перезапису псевдоніму.
Олексій

4
Приклад випадку використання, коли це важливо; видалення на основі вмісту другої таблиці, в якій задіяно кілька стовпців (тобто так inчи not inне буде працювати: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
Видалення з псевдонімом корисно, коли ви хочете видалити з таблиці, але потрібно приєднати цю таблицю до інших таблиць / представлень, щоб отримати зменшений набір рядків. Напр.delete o from Order as o inner join Customer as c on c.CustomerID = o.CustomerID where c.ArchiveOrders = 1
Ендрю Єнс

74

Заява видалення має дивний синтаксис. Виходить так:

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

1
@ Рікардо є лише різницею. Але час підказує, що обидва були розміщені одночасно.
Mukus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.