[英]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.