带分析的Oracle更新语句失败

时间:2016-04-14 06:00:37

标签: oracle sql-update window-functions

Table_B包含重复记录,如下所示。我想要做的是使用Table_B.SERIAL_NUM查找Table_A并使用Table_B中COVERAGE_TO coloumn中的最新Date值更新Table_A .COVERAGE_END coloumn。

表-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

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您必须将J的SERIAL_NUMBER与B进行比较才能获得唯一正确的值。

 where rn = 1 and J.SERIAL_NUMBER = SERIAL_NUM

如果不是,子查询将返回每个SERIAL_NUM的最大值。

答案 1 :(得分:0)

我不确定为什么需要分区。 一个简单的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
   )
;