MySQL, ошибка обновления таблицы по условию, работающему с данной таблицей

программирование MySQL базы данных sql

Доброго времени суток,
Есть следующий запрос:
UPDATE `SC_products` SET `SC_products`.`enabled`=0 WHERE `SC_products`.`productID` IN (SELECT DISTINCT `SC_products`.`productID` FROM
`SC_products` LEFT JOIN `SC_product_options_set`
ON `SC_product_options_set`.`productID` = `SC_products`.`productID`
WHERE `SC_product_options_set`.`productID` IS NULL AND `SC_products`.`enabled` = 1)

В скобках я вычисляю из таблицы products строки, где productID совпадает с productID из product_options_set, из этой разницы делаю выборку по строкам, где enabled = 1
Далее я пытаюсь присвоить этим productID enabled = 0, на что mysql ругается: #1093 - You can't specify target table 'SC_products' for update in FROM clause

Возможно в общем случае это и не безопасно, но в моём должно работать. Как можно оптимизировать запрос, чтобы работало?
Заранее спасибо!

Примечание:
решил задачу гораздо более простым и изящным запросом
UPDATE `SC_products` SET `SC_products`.`enabled`=0 WHERE `SC_products`.`productID` NOT IN (SELECT DISTINCT `SC_product_options_set`.`productID` FROM
`SC_product_options_set`)

но вопрос - как устранить такую ошибку, не меняя решения кардинально, остаётся открытым

Примечание:
>>Хотя одно не понятно: разве Ваш подзапрос не возвращает пустое множество всегда, то есть update запрос не изменяет ничего.
нет, с позапросом всё нормально. он вычитает из products строки, где productID совпадает с productID из product_options_set. Более простой пример - http://stackoverflow.com/questions/2723839/mysql-difference-of-two-result-sets
за советы спасибо!
Ответы:
MySQL не позволяет выбирать в подзапросе из обновляймой таблицы. Можно использовать временную таблицу, хотя в Вашем случае можно обойтись многотабличным update запросом. Хотя одно не понятно: разве Ваш подзапрос не возвращает пустое множество всегда, то есть update запрос не изменяет ничего.


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.