#sql #sql-server #join #sql-update #max
#sql #sql-сервер #Присоединиться #sql-обновить #макс
Вопрос:
Я хотел бы обновить поле FIRST_DATE в таблице MASTER_DB. Однако я хотел бы обновить дату самой последней записи в таблице RECORD_DB.
UPDATE
MASTER_DB
SET
MASTER_DB.FIRST_DATE = RECORD_DB.DATE_R
FROM
MASTER_DB
INNER JOIN
RECORD_DB
ON
MASTER_DB.ID = RECORD_DB.ID
Пример:
I) Таблица MASTER_DB
ID FIRST_DATE
122
II)Таблица RECORD_DB
ID DATE_R
122 2015-01-01
122 2016-01-02
122 2017-01-03
Обновление поля FIRST_DATE таблицы MASTER_DB должно получить самую высокую дату для того же идентификатора, что и таблица RECORD_DB, то есть 2017-01-03
Вывод в таблице MASTER_DB должен быть:
ID FIRST_DATE
122 2017-01-03
Ответ №1:
Правильный синтаксис в MySQL был бы:
UPDATE MASTER_DB m JOIN
(SELECT ID, MAX(DATE_R) AS MIN_DATE_R
FROM RECORD_DB
GROUP BY ID
) R
ON R.ID = m.ID
SET M.FIRST_DATE = R.MAX_DATE_R;
Синтаксис в SQL Server:
UPDATE m
SET M.FIRST_DATE = R.MAX_DATE_R
FROM MASTER_DB m JOIN
(SELECT ID, MAX(DATE_R) AS MAX_DATE_R
FROM RECORD_DB
GROUP BY ID
) R
ON R.ID = m.ID;
Комментарии:
1.
MIN
должно бытьMAX
2. Вам нужно
ON
условие дляJOIN
.3. Вопрос был изменен с MySQL на SQL-Server. Этот ответ предназначен для MySQL.
4. Я даже не заметил, что ответ пришел от того же человека, который спрашивал о тегах.
Ответ №2:
Одним из вариантов является коррелированный подзапрос:
update master_db m
set m.first_date = (select max(r.date_r) from record_db r where r.id = m.id)
Если есть основные строки без какой-либо строки записи, и вы не хотите обновлять их до null
, то более подходящим является объединение — или обновляемый CTE:
with m
set m.first_date = r.max_date_r
from master_db m
inner join (select id, max(r.date_r) max_date_r record_db goup by id) r
on r.id = m.id