我有两张如下表:
TABLE1:
=======
somid, tobeupdated
1 , null
2 , null
3 , null
10 , null
TABLE2:
=======
rangeofids
2
3
9
10
11
12
13
我必须根据以下标准更新TABLE1.tobeupdated(或找到它的'应该是值):
TABLE1.somid NOT exists in TABLE2.rangeofids
,则预期结果为:tobeupdated = TABLE1.somid
TABLE2.rangeofids
,其大于TABLE1.somid
所以期望值是:bu
TABLE1:
=======
somid, tobeupdated
1 , 1
2 , 4
3 , 4
10 , 14
我努力了,但我提出的最简单的解决方案是创建一个包含完整ID序列的临时表(从1
到max(rangeofids)+1
)MINUS TABLE2.rangeofids
,这样我就可以找到MIN(TMPTABLE.id) where TMPTABLE.ID > TABLE1.somid
。
但是没有更好的解决方案(没有临时表)?
注意:我无法创建过程/函数等,因此它必须是标准的(Oracle 10)SQL。
答案 0 :(得分:1)
这是我的尝试。
首先我们应该决定只使用table2在找到值之后应该返回什么值。
select rangeofids,
candidate,
nvl(candidate,lead(candidate ignore nulls) over (order by rangeofids)) as full_candidate
from (
select rangeofids, case when dist=1 then null else rangeofids+1 end as candidate
from (
select rangeofids,
lead(rangeofids) over (order by rangeofids) - rangeofids as dist
from table2
)
);
在此之后,merge into table1 with
以下选择将解决问题:
select someid, nvl(full_candidate, someid)
from table1 a
left join (
--the above query
) b
on a.someid = b.rangeofids;