MySQL Обновление оператора из объединенной таблицы (ограничено последним значением этой таблицы) - PullRequest
0 голосов
/ 30 апреля 2020

Я использую MariaDB 5.5

У меня есть 2 таблицы, я хочу обновить столбец в таблице A на основе информации в таблице B.

Таблица B содержит несколько записей для Идентификатор, который я ищу, но в каждом реестре есть столбец updated_at, поэтому я просто хочу получить последний реестр.

select po_number, sce_status
from infor_order
where po_number = @po
order by updated_at desc;

Это приведет к следующему набору данных, в котором меня интересует только Выделенная часть '

DataSetfor Table B

Итак, я хочу обновить столбец в таблице A, выполнив поиск по последнему значению таблицы B с помощью "po_number", но когда я пытаюсь сделать выбор для проверки объединения, я получаю 2 значения таблицы B для каждого реестра

select b.id, b.PO_NUMBER, b.INFOR_SCE_STATUS, infor.sce_status
from planning_backloguov b
left join (
    select distinct po_number, sce_status
    from infor_order
    order by updated_at desc
) infor on b.PO_NUMBER = infor.po_number
where b.PO_NUMBER = @po;

Result from Query

Если я добавлю «предел 1» в подзапрос левого соединения. Я не получаю никаких результатов из подзапроса.

TL; DR: я просто хочу обновить столбец из таблицы A на основе последнего значения из таблицы B для столбца общего идентификатора между этими двумя таблицами.

1 Ответ

1 голос
/ 30 апреля 2020

Если Я правильно следил за вами, вы можете использовать коррелированный подзапрос для получения самой последней sce_status из таблицы infor_order для po_number из planning_backloguov, например:

update planning_backloguov pb
set pb.sce_status = (
    select io.sce_status
    from infor_order io
    where io.po_number = pb.po_number
    order by io.updated_at desc
    limit 1
)

Если вам нужно обновить более одного столбца, тогда это другой вопрос. В этом случае вам нужно объединение и фильтрация:

update planning_backloguov pb
inner join infor_order io on io.po_number = pb.po_number
set 
    pb.sce_status = io.sce_status,
    pb.some_other_column = io.some_other_column  -- change to the actual column name
where io.updated_at = (
    select max(io1.updated_at)
    from infor_order io1
    where io1.po_number = io.po_number
)
...