在表SQL中查找具有不连续范围的下一个未使用的ID

时间:2013-01-31 09:55:54

标签: sql oracle range nextval

我有两张如下表:

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
  3. 所以期望值是:bu

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

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

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

    注意:我无法创建过程/函数等,因此它必须是标准的(Oracle 10)SQL。

1 个答案:

答案 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;

See SQLFIDDLE.