0

我有两个如下表:

TABLE1:
=======
somid, tobeupdated
1    ,  null
2    ,  null
3    ,  null
10   ,  null

TABLE2:
=======
rangeofids
2
3
9
10
11
12
13

我必须根据以下标准更新 TABLE1.tobeupdated (或发现它的'应该是值):

  1. 如果TABLE1.somid NOT exists in TABLE2.rangeofids,那么预期结果是:tobeupdated =TABLE1.somid
  2. 否则找到下一个TABLE2.rangeofids更大的可用(或未使用)TABLE1.somid

所以预期值为:bu

TABLE1:
=======
somid, tobeupdated
1    ,  1
2    ,  4
3    ,  4
10   ,  14

我很努力,但我想出的最简单的解决方案是创建一个具有完整 id 序列(从1to max(rangeofids)+1)的临时表,MINUS TABLE2.rangeofids这样我就可以找到MIN(TMPTABLE.id) where TMPTABLE.ID > TABLE1.somid.

但是没有更好的解决方案(没有临时表)吗?

注意:我不能创建过程/函数等,所以它必须是标准(Oracle 10)SQL。

4

1 回答 1

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;

请参阅 SQLFIDDLE。

于 2013-01-31T10:27:23.147 回答