所以一个困境,我有一个名为T_GROUP的Oracle表。表中的记录具有唯一ID(ID),它们是Study_ID所标识的研究的一部分,因此多个组可以在同一研究中。
CREATE TABLE T_GROUP
(
"ID" NUMBER(10,0),
"GROUP_NAME" VARCHAR2(255 CHAR),
"STUDY_ID" NUMBER(10,0)
)
现有表有数百条记录,现在我添加了一个名为GROUP_INDEX的新列:
ALTER TABLE T_GROUP ADD (
GROUP_INDEX NUMBER(10,0) DEFAULT(0)
);
添加列后,我需要运行一个脚本来更新GROUP_INDEX字段:它应该从1开始,并在研究中的每个组增加1,从最低ID开始。
所以现在我的数据如下:
ID GROUP_NAME STUDY_ID GROUP_INDEX
-------------------------------------------
1 Group 1 3 0
2 Group 2 3 0
3 My Group 5 0
4 Big Group 5 0
5 Group X 5 0
6 Group Z 6 0
7 Best Group 6 0
更新后,group_index字段应如下所示:
ID GROUP_NAME STUDY_ID GROUP_INDEX
-------------------------------------------
1 Group 1 3 1
2 Group 2 3 2
3 My Group 5 1
4 Big Group 5 2
5 Group X 5 3
6 Group Z 6 1
7 Best Group 6 2
更新将通过批处理文件从sqlplus运行。我玩过分组和子查询,但我运气不好,从未使用过sqlplus,我不确定是否可以使用变量,游标等等。所有提示都非常感谢!
答案 0 :(得分:4)
您应该能够将分析函数row_number
用于此
UPDATE t_group t1
SET group_index = (SELECT rnk
FROM (SELECT id,
row_number() over (partition by study_id
order by id) rnk
FROM t_group) t2
WHERE t2.id = t1.id)
答案 1 :(得分:2)
这是使用MERGE语句的版本。可能比子选择更快(但不一定是)。
merge into t_group
using
(
select id,
row_number() over (partition by study_id order by id) rnk
from t_group
) t on t.id = t_group.id
when matched then update
set group_index = t.rnk;
这假设id是主键(或至少是唯一的)
我现在无法测试,因此可能会出现一些语法错误。