简体   繁体   English

通过分组更新SQL查询

[英]SQL query update by grouping

I'm dealing with some legacy data in an Oracle table and have the following 我正在处理Oracle表中的一些遗留数据并具有以下内容

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

For each of the /FOO/BAR/BAZ/% records I want to make the ID a Unique incrementing number. 对于每个/ FOO / BAR / BAZ /%记录,我想使ID成为唯一的递增数字。 Is there a method to do this in SQL? 有没有在SQL中执行此操作的方法?

Thanks in advance 提前致谢

EDIT 编辑

Sorry for not being specific. 很抱歉没有具体说明。 I have several groups of records /FOO/BAR/BAZ/, /FOO/ZZZ/YYY/. 我有几组记录/ FOO / BAR / BAZ /,/ FOO / ZZZ / YYY /。 The same transformation needs to occur for each of these other (example) groups. 需要对这些其他(示例)组中的每一个进行相同的转换。 The recnum can't be used I want ID to start from 1, incrementing, for each group of records I have to change. 无法使用recnum我希望ID从1开始,递增,对于我必须更改的每组记录。

Sorry for making a mess of my first post. 很抱歉弄乱了我的第一篇文章。 Output should be 输出应该是

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

Let's try something like this(Oracle version 10g and higher): 让我们尝试这样的东西(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

I think that actual updating the ID column wouldn't be a good idea. 我认为实际更新ID列不是一个好主意。 Every time you add new groups of data you would have to run the update statement again. 每次添加新数据组时,都必须再次运行update语句。 The better way would be creating a view and you will see desired output every time you query it. 更好的方法是创建一个视图,每次查询时都会看到所需的输出。

rownum can be used as an incrementing ID? rownum可以用作递增ID吗?

UPDATE legacy_table
    SET id = ROWNUM;

This will assign unique values to all records in the table. 这将为表中的所有记录分配唯一值。 This link contains documentation about Oracle Pseudocolumn . 此链接包含有关Oracle Pseudocolumn的文档

您可以运行以下命令:

update <table_name> set id = rownum where descr like 'FOO/BAR/BAZ/%'

This is pretty rough and I'm not sure if your RefNo is a single value column or you just made it like that for simplicity. 这非常粗糙,我不确定你的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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM