SQL — обновление таблицы из другой таблицы выбор строки обновления на основе параметра «приоритет». (PostgreSQL 11.0)

#sql #postgresql

#sql #postgresql

Вопрос:

Я пытаюсь обновить столбец ‘ea’ из A значением ‘ea’ в таблице B.

Таблица A имеет ‘cfn’ и ‘ea’ и содержит уникальные записи продукта.

Таблица B содержит ‘cfn’, ‘ea’ и ‘dchain’ и может содержать несколько записей для одного и того же продукта (разные dchain).

Поле таблицы B ‘dchain’ связано с таблицей C, которая имеет значение ‘dc’ и значение ‘prio’ (целое число).

Запись для выбора из таблицы B для обновления таблицы A должна основываться на приоритете таблицы C. Я пробовал несколько вариантов с ограничением и порядком, но почему-то мне не хватает правильной последовательности, так как результат всегда неправильный…..

Таблица A

Таблица B

Таблица C

Комментарии:

1. Пожалуйста, добавьте свой уставший код

2. это был код, который у меня был ранее: update cfn_check a установите a.ea = b.ea из mstrdata_s153 b, где b.dchain= ‘DR’ и a.cfn = b.cfn; Проблема теперь в том, что мне нужно изменить выбор b.dchain на наибольшее значение добавленной таблицыC

Ответ №1:

Если я правильно понимаю, вы можете получить значения для обновления с помощью:

 select distinct on (b.cfn) b.*
from b join
     c
     on b.dchain = c.dc
order by b.cfn, c.priority;
 

Примечание: Предполагается, что более низкие приоритеты более важны. Если более высокие приоритеты добавляются desc ко второму ключу.

Затем вы можете включить это в update :

 update a
    set a.ea = bc.ea
    from (select distinct on (b.cfn) b.*
          from b join
               c
               on b.dchain = c.dc
          order by b.cfn, c.priority
         ) bc
    where bc.cfn = a.cfn;
 

Комментарии:

1. Гордон, спасибо! Идеальное решение, и я многому научился!

2. @GielHendrix . , , Если это отвечает на ваш вопрос, вы можете принять ответ.