2012-04-19 53 views
1

因此,我有一個名爲T_GROUP的Oracle表。表中的記錄具有唯一的ID(ID),它們是由STUDY_ID標識的研究的一部分,因此多個組可以在同一個研究中。在Oracle中使用增量值更新分組記錄

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開始以1遞增。

所以現在我有數據如下:

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我不確定我是否可以使用變量,遊標等。所有提示非常感謝!

回答

3

您應該能夠使用解析函數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) 
+0

那,先生,是最優秀的。它適用於8個記錄的小表格,所以我將在明天對dev/test dbs進行測試,如果它能正常工作,您會得到一個很大的綠色記號! – 2012-04-19 23:53:17

+2

這適用於小表,但它具有O(N^2)性能......在處理較大的表時使用合併語句。 – 2012-04-20 06:27:34

+0

感謝羅布 - 你可以展示如何在這種情況下使用合併的例子嗎? – 2012-04-20 07:24:30

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是主鍵(或者至少是唯一的)

我現在不能測試,所以可能有一些語法錯誤在裏面。