Почему в этом запросе SQL DELETE с использованием другого вывода запроса в качестве условия WHERE возникает ошибка?

Я не очень разбираюсь в SQL, и у меня возникла следующая проблема. Я использую MySql

У меня есть таблица с именем Market_Commodity_Price_Series, и мне нужно удалить некоторые записи из этой таблицы, используя вывод запроса как условие WHERE, поэтому я сделал что-то вроде этого:

DELETE FROM Market_Commodity_Price_Series
WHERE Market_Commodity_Price_Series.id = (SELECT MCPS.id
FROM  Market_Commodity_Price_Series as MCPS
WHERE 
      month(MCPS.price_date) > 3
AND
      year(MCPS.price_date) = 2018)

Этот запрос

(SELECT MCPS.id
FROM  Market_Commodity_Price_Series as MCPS
WHERE 
      month(MCPS.price_date) > 3
AND
      year(MCPS.price_date) = 2018)

вернуть n ID, который идентифицирует запись, которую необходимо удалить.

Проблема в том, что при выполнении этого запроса на удаление я получаю следующее сообщение об ошибке:

HY000: Вы не можете указать целевую таблицу Market_Commodity_Price_Series для обновления в предложении FROM

Почему? В чем проблема? Что мне не хватает? Как я могу исправить эту проблему?


person AndreaNobili    schedule 13.03.2018    source источник
comment
Сообщение ясное, вы не можете выбирать и удалять из одной таблицы. Прочитать baout Delete .. join   -  person Jens    schedule 13.03.2018
comment
Ответ ниже, хотя и отклонен, вам нужно скопировать свой подзапрос во временную таблицу и оттуда нарисовать условное выражение.   -  person Napoli    schedule 13.03.2018
comment
Думаю, это тоже должно работать: SET @id = (SELECT...); DELETE FROM...WHERE...id = @id;. Сначала вы получаете свой идентификатор с помощью запроса SELECT, затем вы используете результат для своего DELETE   -  person Mickaël Leger    schedule 13.03.2018


Ответы (3)


Извините, это была абсолютно простая задача:

DELETE FROM Market_Commodity_Price_Series
WHERE MONTH(price_date) > 3 AND YEAR(price_date) = 2018
person AndreaNobili    schedule 13.03.2018

Попробуйте запрос ниже

УДАЛИТЬ ИЗ Market_Commodity_Price_Series WHERE Market_Commodity_Price_Series.id = (ВЫБРАТЬ * ИЗ (ВЫБРАТЬ MCPS.id ИЗ Market_Commodity_Price_Series как MCPS WHERE месяц (MCPS.price_date)> 3 И год (MCPS.price_date) = 2018) tblT

Запрос в основном тот же, за исключением того, что внутренний выбор заключен внутри другого выбора. Самая важная вещь, на которую следует обратить внимание, это то, что исходному выделенному объекту был присвоен псевдоним «tblTmp». (Имя tblTmp произвольно, вы можете дать ему любое имя псевдонима.) Псевдоним важен, потому что его присвоение укажет MySQL на создание временной таблицы из этого запроса выбора. Затем временная таблица может использоваться как исходный критерий для оператора обновления.

Причина, по которой он заключен в другой запрос, заключается в том, что синтаксис MySQL не позволяет вам назначать псевдоним для запроса выбора, когда он является частью оператора обновления. Поэтому мы должны поместить его в другой запрос, который, я полагаю, отделяет его от оператора обновления.

person Arunkumar Muthuvel    schedule 13.03.2018
comment
OP не нуждается в запросе такой сложности, q.v. удаленные ответы и комментарии. - person Tim Biegeleisen; 13.03.2018

Не уверен, но думаю, так и должно быть

DELETE * FROM Market_Commodity_Price_Series
WHERE [...]
person Commander Schnitzel    schedule 13.03.2018