Оператор обновления MySQL с подзапросом

#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 .