У меня есть таблица со старыми значениями (некоторые нулевые) и новыми значениями для различных атрибутов, все они вставляются в разное время добавления в течение месяцев. Я пытаюсь обновить вторую таблицу с записями с датами окончания рабочего месяца. В настоящее время эти записи содержат только самые новые новые значения для всех дат окончания месяца. Цель состоит в том, чтобы создать исторические данные путем обновления значений на конец предыдущего месяца старыми значениями из первой таблицы. Я новичок и смог придумать запрос на обновление для одного объекта, где была одна запись из первой таблицы. Сейчас я пытаюсь расширить запрос, включив в него несколько объектов с возможными множественными старыми значениями в течение одного месяца. Я попытался использовать «упорядочить по» (поскольку мне нужно делать обновления в течение месяца в порядке возрастания, чтобы он получал последнее значение), но прочитал, что не работает с операторами обновления без подзапроса. Поэтому я попытался сделать более сложный запрос, но безуспешно. Я получаю следующую ошибку: однострочный подзапрос возвращает более одной строки. Спасибо!
TableA:
| ID | TYPE | OLD_VALUE | NEW_VALUE | ADD_TIME|
-----------------------------------------------
| 1 | A | 2 | 3 | 1/11/2019 8:00:00am |
| 1 | B | 3 | 4 | 12/10/2018 8:00:00am|
| 1 | B | 4 | 5 | 12/11/2018 8:00:00am|
| 2 | A | 5 | 1 | 12/5/2018 08:00:00am|
| 2 | A | 1 | 2 | 12/5/2019 09:00:00am|
| 2 | A | 2 | 3 | 12/5/2019 10:00:00am|
| 2 | B | 1 | 2 | 12/5/2019 10:00:00am|
TableB
| ID | MONTH_END | TYPE_A | TYPE_B |
-----------------------------------
| 1 | 1/31/19 | 3 | 5 |
| 1 | 12/31/18 | 3 | 5 |
| 1 | 11/30/18 | 3 | 5 |
| 2 | 12/31/18 | 3 | 2 |
| 2 | 11/30/18 | 3 | 2 |
Желаемый выход для таблицы B
| ID | MONTH_END | TYPE_A | TYPE_B |
-----------------------------------
| 1 | 1/31/19 | 3 | 5 |
| 1 | 12/31/18 | 2 | 5 |
| 1 | 11/30/18 | 2 | 3 |
| 2 | 12/31/18 | 3 | 2 |
| 2 | 11/30/18 | 5 | 2 |
Мой запрос для типа A (который я планирую адаптировать для типа B и выполнить для желаемого результата)
update TableB B
set b.type_a =
(
with aa as
(
select id, nvl(old_value, new_value) typea, add_time
from TableA
where type = 'A'
order by id, add_time ascending
)
select typea
from aa
where aa.id = b.id
and b.month_end <= aa.add_tm
)
where exists
(
with aa as
(
select id, nvl(old_value, new_value) typea, add_time
from TableA
where type = 'A'
order by id, add_time ascending
)
select typea
from aa
where aa.id = b.id
and b.month_end <= aa.add_tm
)