0

次のような2つのテーブルがあります。

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、期待される結果は次のとおりです。TABLE1.somid
  2. そうでない場合は、次の使用可能な (または未使用の)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である必要があります。

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 に答える