Таблица_B содержит повторяющиеся записи, как показано ниже. Я пытаюсь найти Table_A, используя Table_B.SERIAL_NUM, и обновить столбец Table_A .COVERAGE_END самым последним значением Date в столбце COVERAGE_TO в Table_B.

Таблица_B

SERIAL_NUM  ,COVERAGE_FROM  ,COVERAGE_TO 
123456  ,26/12/2014 ,13/12/2015
123456  ,14/12/2015 ,13/12/2016
23456   ,18/12/2014 ,13/12/2015
23456   ,14/12/2015 ,13/12/2016

Ниже приводится инструкция обновления, которую я использую.

update Table_A J
set ( J.COVERAGE_END_DATE)
=(select COVERAGE_TO from 
(
select SERIAL_NUM, COVERAGE_TO, row_number() over(partition by SERIAL_NUM order by COVERAGE_TO desc) as rn from  TABLE_B B

)where rn = 1
)
where exists
(
select * from TABLE_B Q where Q.SERIAL_NUM = J.SERIAL_NUMBER
)
;

Однако я получаю следующую ошибку

ORA-01427: single-row subquery returns more than one row

Кто-нибудь может помочь мне с этим запросом?

1
Dilan Perera 14 Апр 2016 в 09:00

2 ответа

Лучший ответ

Вы должны сравнить SERIAL_NUMBER J с B, чтобы получить единственно правильное значение.

 where rn = 1 and J.SERIAL_NUMBER = SERIAL_NUM

Если нет, подзапрос вернет максимальное значение для каждого SERIAL_NUM.

0
J.Cheong 14 Апр 2016 в 06:34

Я не уверен, зачем здесь нужно разбиение. Разве простой MAX () не даст желаемого результата?

update table_a
   set coverage_end_date = (
     select max(coverage_to)
       from table_b b inner join table_a a on b.serial_num = a.serial_num
   )
;
0
Zastai 16 Апр 2016 в 14:21