Почему я не могу использовать псевдоним в инструкции DELETE?


158

В SQL Server Compact Edition в 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/…
Даниэль Нил

Ответы:


239

Для псевдонима таблицы вы должны сказать:

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

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


2
В основном мне было просто любопытно, потому что я обычно использую псевдонимы при использовании SELECTи других подобных утверждений, поэтому я инстинктивно делал то, к чему привык, и удивлялся, почему это не работает должным образом.
Рикардо Альтамирано

41
+1 В случае с OP псевдонимы могут не понадобиться, но это было полезно для меня, потому что я использовал предложение 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
Единственное отличие @Ricardo - это схема. Но время подсказывает, что оба были опубликованы одновременно.
Мукус
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.