Обновить последние данные

#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