#mysql #sql #database #mysql-workbench
#mysql #sql #База данных #mysql-workbench
Вопрос:
пожалуйста, взгляните на это заявление, которое я пишу в MySQL Workbench:
update customer set flag = 1
where id in (select id from customer
group by phoneNumber
having count(phoneNumber) > 1);
Отображается следующее сообщение:
Error Code: 1093. You can't specify target table 'customer' for update in FROM clause
Что я делаю не так?
Комментарии:
1. Не могли бы вы опубликовать некоторые примеры данных и желаемый набор результатов?
Ответ №1:
попробуйте это:
update customer set flag = 1
where id in (select * from (select id from customer
group by phoneNumber
having count(phoneNumber) > 1)t ) ;
Комментарии:
1. Это работает! Пожалуйста, объясните мне, зачем нужен дополнительный ‘select *’?
2. потому что в дополнительном select нет FROM table . в ваших сообщениях об ошибках не может быть указана целевая таблица, поэтому вам нужен подзапрос.
3. О, теперь я понял… я начинаю с MySQL, и люди говорят, что MySQL полон этих маленьких «ошибок»… теперь я начинаю понимать 🙂 спасибо за помощь, я отмечу как отвеченный как можно скорее
Ответ №2:
Вот еще один вариант, пытающийся избежать ошибки (я использовал другую группу по stmt, см. Ниже. Это может не отражать то, что вы пытаетесь сделать):
update customer a
join ( select id
from customer b
group by id
having count(1) > 1
) b on a.id = b.id
set a.flag = 1;
Часть вашего заявления select id from customer group by phoneNumber
— это, кстати, еще одна особенность mysql. В sql92 он недействителен, и если id функционально не зависит от phonenumber, он также недействителен в sql99 и более поздних версиях. Вы можете обеспечить более строгое поведение, установив ONLY_FULL_GROUP_BY в @@sql_mode .