Oracle 11g: заменить запись в таблице A последней записью из таблицы B - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть 2 таблицы, таблица A и таблица B. Мне нужно вернуть все записи из таблицы A, но мне нужно заменить COL_A на последнее значение COL_A из TABLE_B, если идентификатор существует.

TABLE_A                       TABLE_B
ID COL_A                      A_ID   COL_A  CREATED_DATE
1  AAA                        1      AA1    1/11/18
2  BBB                        1      AA2    1/12/18
3  CCC                        3      CC1    1/12/18

Ожидаемый результат:

ID COL_A
1  AA2
2  BBB
3  CC1

Я могу выполнить следующее с Oracle 12c, но не на 11g.Нужна помощь с запросом по 11g?

select ID, 
NVL((select * from (select FIRST_VALUE(COL_A) OVER (ORDER BY CREATED_DATE DESC) from TABLE_B WHERE A_ID=A.ID) where ROWNUM=1),COL_A) AS COL_A
from TABLE_A A

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Я был бы склонен использовать оконные функции:

select a.id, coalesce(b.col_a, a.col_a) as col_a
from a left join
     (select b.*,
             row_number() over (partition by b.a_id order by b.created_date) as seqnum
      from b
     ) b
     on b.a_id = a.id and b.seqnum = 1;

Это кажется намного проще, чем версия, которая использует join и коррелированный подзапрос.

0 голосов
/ 04 декабря 2018

Вам не хватает соединения между 2 таблицами и подзапросом для проверки максимальной даты:

select a.ID, NVL(b.col_a, a.col_a) 
from TABLE_A a left outer join TABLE_B b 
on a.id = b.a_id 
and b.created_date = 
(select max(innerB.createdDate) from Table_B innerB where innerB.a_id = a.id);

Попробуйте и сообщите мне в случае ошибки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...