Dier_Sergio_Great
@Dier_Sergio_Great
Увлеченный человек

Как сделать DELETE с вложенным SELECT`ом?

Уважаемые ГУРУ дайте совет в чем может быть ошибка в скрипте DELETE с вложенным SELECT`ом.

DELETE FROM pac0x_jshopping_products p 
WHERE p.product_publish = FALSE AND p.RepertoireId !=0 AND p.product_id NOT IN (
    SELECT MIN(g.product_id) FROM pac0x_jshopping_products g GROUP BY g.RepertoireId);

Сервер возвращает ошибку:
[Исключение, код ошибки 1 064, SQLState 42000] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'p 
WHERE p.product_publish = FALSE AND p.RepertoireId !=0 AND p.product_id NOT I' at line 1

Хотя при этом код отлично отрабатывает этот:
SELECT * FROM pac0x_jshopping_products p 
WHERE p.product_publish = FALSE AND p.RepertoireId !=0 AND p.product_id NOT IN (
    SELECT MIN(g.product_id) FROM pac0x_jshopping_products g GROUP BY g.RepertoireId);

Смысл же общей задачи в том чтобы удалить все продукты, кроме каждого RepertoireId;
Чтобы оставались продукта по одному с уникальным RepertoireId
  • Вопрос задан
  • 1491 просмотр
Пригласить эксперта
Ответы на вопрос 2
AloneCoder
@AloneCoder
[object Object]
Кажется нужно select в select завернуть
DELETE FROM pac0x_jshopping_products
WHERE p.product_publish = FALSE AND p.RepertoireId !=0 AND p.product_id NOT IN (
    SELECT pid FROM (SELECT MIN(g.product_id) as pid FROM pac0x_jshopping_products g GROUP BY g.RepertoireId));
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
Исторически mysql сообщает об ошибке синтаксиса начиная с того места, где эта ошибка случилась.
Т.е. парсер mysql не умеет использовать алиас таблицы для delete запросов.

Или, как следует из документации
Table aliases in a multiple-table DELETE should be declared only in the table_references part of the statement. Elsewhere, alias references are permitted but not alias declarations.

Возможно сделать вырожденный случай мультитабличного удаления с одной таблицей, тогда алиас для таблицы задать возможно:
delete t from test as t where t.i = 100;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы