我正在处理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 |
--------------------------------------------
答案 0 :(得分: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语句。更好的方法是创建一个视图,每次查询时都会看到所需的输出。
答案 1 :(得分:1)
rownum可以用作递增ID吗?
UPDATE legacy_table
SET id = ROWNUM;
这将为表中的所有记录分配唯一值。 This link contains documentation about Oracle Pseudocolumn
答案 2 :(得分:0)
您可以运行以下命令:
update <table_name> set id = rownum where descr like 'FOO/BAR/BAZ/%'
答案 3 :(得分: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