通过分组更新SQL查询

时间:2012-11-13 14:20:49

标签: sql oracle

我正在处理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 个答案:

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