Обновите таблицу Oracle, используя другую негруппированную таблицу - PullRequest
0 голосов
/ 26 мая 2018

Сценарий включает две таблицы со следующими структурами:

>table e1:


Id    Name    Addr
---------------------
1     Ramas
2     Sam
3     Musa
4     Sebi



>table e1_addr:



Id   Addr    Mod_Date
-----------------------
1    Gzb     10-05-2018
1    Dli     18-05-2018
2    Gzb     25-05-2018
2    Dli     22-05-2018
3    Gzb     09-05-2018
3    Dli     05-05-2018
4    Gzb     14-05-2018
4    Dli     24-05-2018

Таблица e1 имеет 4 сотрудника без обновленных адресов в столбце address.таблица e_addr имеет обновленную запись адреса для каждого идентификатора со столбцом mod_date, в котором указана дата ввода записи.

Мне нужно обновить таблицу e1, чтобы ее столбец addr имел значение изe1_addr таблица с максимумом mod_date.

С моей стороны, я пытался извлечь addr из e1_addr таблицы, соответствующей max(mod_date), но не смог достичь желаемого результата.

Требуемый вывод выглядит следующим образом:

Final Table :


Id   Name   Addr
------------------
1   Ramas   Dli
2   Sam     Gzb
3   Musa    Gzb
4   Sebi    Dli

Любая и вся помощь будет принята.

Пожалуйста, сообщите, если я должен дать более подробную информацию.

Ответы [ 5 ]

0 голосов
/ 27 мая 2018

Спасибо всем за ответы и ответы на различные вопросы, которые вы отправили для решения вопроса, в то время как я нашел гораздо более простой способ сделать то же самое после обсуждения с одним из моих юниоров.Мне стало жалко себя.

update e1 a set a.addr=(select addr from e1_addr b
where mod_date= (select max(mod_date) from e1_addr
where id=  a.id ));

Спасибо за поддержку, ребята!

0 голосов
/ 27 мая 2018

Не удержался, синтаксис MERGE еще не был упомянут:

MERGE INTO e1 USING (SELECT ID, MAX(addr) KEEP (DENSE_RANK FIRST ORDER BY mod_date DESC) AS newest_addr
                       FROM e1_addr GROUP BY ID) q ON (e1.ID = q.ID)
WHEN MATCHED THEN UPDATE SET e1.addr = q.newest_addr;

Этот подзапрос выбирает самый новый адрес для каждого идентификатора:

SELECT ID, MAX(addr) KEEP (DENSE_RANK FIRST ORDER BY mod_date DESC) AS newest_addr
  FROM e1_addr GROUP BY ID;

ID newest_addr  
1  Dli
2  Gzb 
3  Gzb
4  Dli

...и MERGE просматривает каждый id в подзапросе, и если он находит совпадение, он обновляет addr.

Некоторые люди любят это, некоторые ненавидят.

0 голосов
/ 26 мая 2018

Вы можете попробовать этот запрос, чтобы обновить Addr столбец.

функция Windows с ROW_NUMBER, чтобы получить Rownumber 1 на e1_addr, что означает MAX Mod_Date.

, затем обновите e1.addr.

UPDATE 
(
  SELECT t.addr as OLD,t2.addr as NEW
  FROM e1 t 
  INNER JOIN 
  (
    SELECT t2.*,ROW_NUMBER() OVER(PARTITION BY t2.ID ORDER BY t2.Mod_Date desc) rn
    FROM e1_addr t2 
  ) t2 on t.id = t2.id
  where t2.rn = 1
) t
SET t.OLD = t.NEW

или другой запрос на обновление, который можно попробовать выполнить подзапросом.

UPDATE e1 t1
SET t1.addr = (SELECT t2.addr
FROM 
  (
    SELECT t2.*,ROW_NUMBER() OVER(PARTITION BY t2.ID ORDER BY t2.Mod_Date desc) rn
    FROM e1_addr t2 
  ) t2
  WHERE t2.rn = 1 and t1.id = t2.id
)

sqlfiddle: http://sqlfiddle.com/#!4/e14f5/1

0 голосов
/ 26 мая 2018

Вы можете сделать это с помощью keep:

update e1
    set addr = (select max(a.addr) keep (dense_rank first order by mod_date desc)
                from ei_addr a
                where e1.id = a.id
               );

Я бы посоветовал вам не хранить адрес в двух местах, а просто получить последний адрес при запросе таблицы e1.

0 голосов
/ 26 мая 2018

Попробуйте это:

Шаг 1: Извлечение идентификатора и максимальной даты из таблицы адресов
Шаг 2: Регистрация идентификатора и максимальной даты с адресомтаблица для получения адреса
Шаг 3 Присоединитесь к этой таблице с моей таблицей e1, чтобы получить окончательный результат

select p.*,q.addr
from
e1 p
left join
(
  select a.id,b.addr
  from
     (select id,max(mod_date) as updated_date
     from e1_addr
     group by id ) a
  left join
     e1_addr b
  on a.id = b.id and a.updated_date = b.mod_date
) q
on p.id = q.id;

Сообщите мне в случае каких-либо проблем

...