3

Oracleテーブルのいくつかのレガシーデータを扱っており、次のものがあります

--------------------------------------------
| RefNo                         |     ID   |                          
--------------------------------------------
| FOO/BAR/BAZ/AAAAAAAAAA        |      1   |
| FOO/BAR/BAZ/BBBBBBBBBB        |      1   |
| FOO/BAR/BAZ/CCCCCCCCCC        |      1   |
| FOO/BAR/BAZ/DDDDDDDDDD        |      1   |
--------------------------------------------

/ FOO / BAR / BAZ /%レコードごとに、IDを一意の増分番号にします。SQLでこれを行う方法はありますか?

前もって感謝します

編集

具体的ではないことをお詫び申し上げます。/ FOO / BAR / BAZ /、/ FOO / ZZZ /YYY/のレコードのグループがいくつかあります。これらの他の(例)グループのそれぞれについて、同じ変換を行う必要があります。recnumは使用できませんIDを1から開始し、変更する必要のあるレコードのグループごとに増分します。

私の最初の投稿を台無しにしてすみません。出力は

--------------------------------------------
| RefNo                         |     ID   |                          
--------------------------------------------
| FOO/BAR/BAZ/AAAAAAAAAA        |      1   |
| FOO/BAR/BAZ/BBBBBBBBBB        |      2   |
| FOO/BAR/BAZ/CCCCCCCCCC        |      3   |
| FOO/BAR/BAZ/DDDDDDDDDD        |      4   |
| FOO/ZZZ/YYY/AAAAAAAAAA        |      1   |
| FOO/ZZZ/YYY/BBBBBBBBBB        |      2   |
--------------------------------------------
4

4 に答える 4

3

次のようなものを試してみましょう(Oracleバージョン10g以降):

SQL> with t1 as(
  2    select 'FOO/BAR/BAZ/AAAAAAAAAA' as RefNo,  1 as ID from dual union all
  3    select 'FOO/BAR/BAZ/BBBBBBBBBB',  1 from dual union all
  4    select 'FOO/BAR/BAZ/CCCCCCCCCC',  1 from dual union all
  5    select 'FOO/BAR/BAZ/DDDDDDDDDD',  1 from dual union all
  6    select 'FOO/ZZZ/YYY/AAAAAAAAAA',  1 from dual union all
  7    select 'FOO/ZZZ/YYY/BBBBBBBBBB',  1 from dual union all
  8    select 'FOO/ZZZ/YYY/CCCCCCCCCC',  1 from dual union all
  9    select 'FOO/ZZZ/YYY/DDDDDDDDDD',  1 from dual
 10  )
 11  select row_number() over(partition by ComPart order by DifPart) as id
 12       , RefNo
 13     From (select regexp_substr(RefNo, '[[:alpha:]]+$')   as DifPart
 14                , regexp_substr(RefNo, '([[:alpha:]]+/)+') as ComPart
 15                , RefNo
 16                , Id
 17             from t1
 18           ) q
 19  ;

        ID REFNO
---------- -----------------------
         1 FOO/BAR/BAZ/AAAAAAAAAA
         2 FOO/BAR/BAZ/BBBBBBBBBB
         3 FOO/BAR/BAZ/CCCCCCCCCC
         4 FOO/BAR/BAZ/DDDDDDDDDD
         1 FOO/ZZZ/YYY/AAAAAAAAAA
         2 FOO/ZZZ/YYY/BBBBBBBBBB
         3 FOO/ZZZ/YYY/CCCCCCCCCC
         4 FOO/ZZZ/YYY/DDDDDDDDDD

実際にID列を更新するのは良い考えではないと思います。新しいデータグループを追加するたびに、updateステートメントを再度実行する必要があります。より良い方法は、ビューを作成することであり、クエリを実行するたびに目的の出力が表示されます。

于 2012-11-13T14:47:01.837 に答える
1

rownumは増分IDとして使用できますか?

UPDATE legacy_table
    SET id = ROWNUM;

これにより、テーブル内のすべてのレコードに一意の値が割り当てられます。 このリンクには、OraclePseudocolumnに関するドキュメントが含まれています

于 2012-11-13T14:26:21.120 に答える
0

次を実行できます。

update <table_name> set id = rownum where descr like 'FOO/BAR/BAZ/%'
于 2012-11-13T14:29:49.573 に答える
0

これはかなり大雑把で、RefNoが単一値の列なのか、単純化のためにそのようにしただけなのかはわかりません。

select 
    sub.RefNo
    row_number() over (order by sub.RefNo) + (select max(id) from TABLE),

from (
    select FOO+'/'+BAR+'/'+BAZ+'/'+OTHER as RefNo
    from TABLE
    group by FOO+'/'+BAR+'/'+BAZ+'/'+OTHER
) sub
于 2012-11-13T14:33:22.180 に答える