1

所以进退两难,我有一个名为 T_GROUP 的 Oracle 表。表中的记录具有唯一的 ID (ID),它们是 Study 的一部分,由 STUDY_ID 标识,因此多个组可以在同一个 Study 中。

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 开始,并为study中的每个组递增 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 运行。我玩过 group by 和 sub 查询,但运气不佳,而且从未使用过 sqlplus,我不确定是否可以使用变量、游标等。非常感谢所有提示!

4

2 回答 2

6

您应该能够为此使用分析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)
于 2012-04-19T23:08:32.533 回答
3

这是使用 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 是主键(或至少是唯一的)

我现在无法对其进行测试,因此其中可能存在一些语法错误。

于 2012-04-20T17:04:52.213 回答