1

つまり、ジレンマとして、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から始まり、スタディ内のグループごとに最小の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から実行されます。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 に答える