@CocaColaBear

UPDATE одного поля с группировкой по родителю и с условием?

Доброго времени суток!
Образовалась небольшая проблемка. Есть две таблицы: organization (id, name), address (id, name, primary, organizationfk). У одной организации есть несколько адресов и из всех, только один - основной. Если же у организации адрес один, то он по-дефолту - основной.
Проблема заключается в том, что на данном этапе, по ошибке человека, у одной организации несколько основных адресов.
Можете помочь составить запрос, который бы из всех адресов у организации, пометил основным только один. Но есть один момент еще, нужно, чтобы если у организации только один основной, то данную организацию и ее адреса не трогать (они валидные и заполнялись пользователями). Изменить нужно только те адреса, которые привязаны к одой организации, но среди них, несколько основных.
  • Вопрос задан
  • 260 просмотров
Решения вопроса 1
zoroda
@zoroda
Необычный Fullstack
Оставит только один primary адрес для организации.

update address a
set a."primary" = q1.is_primary
from (
	select
	id
	,(row_number() over (partition by organizationfk order by nullif("primary", false))) = 1 is_primary
	from address 
) q1
where q1.id=a.id
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Примерно так, но лучше сначала проверьте на копии
UPDATE `address` AS `a1`
  JOIN (
    SELECT MIN(`id`) AS `id` FROM `address` GROUP BY `organizationfk`
  ) AS `a2` ON `a2`.`id` = `a1`.`id`
  LEFT JOIN (
    SELECT `organizationfk` FROM `address` WHERE `primary` = 1
  ) AS `a3` ON `a3`.`organizationfk` = `a1`.`organizationfk`
  SET `a1`.`primary` = 1
  WHERE `a3`.`organizationfk` IS NULL
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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