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列并不是一个好主意。每次添加新的数据组时,都必须再次运行更新语句。更好的方法是创建一个视图,每次查询时都会看到所需的输出。

于 2012-11-13T14:47:01.837 回答
1

rownum 可以用作递增的 ID 吗?

UPDATE legacy_table
    SET id = ROWNUM;

这将为表中的所有记录分配唯一值。 此链接包含有关 Oracle Pseudocolumn 的文档

于 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 回答