2009-04-17 13 views
0

私は誰かがこの問題に対処するための簡単な方法について助言してくれることを願っています。私は高度に正規化されたデータセットの平坦なビューを作成しようとしています。フラット化の目標は、通常の人々がレポートを作成するために使用できるビューを提供することです。示すように、ソースデータテーブルのカップルが含ま:Oracle:名前の値のペアをテーブルにまとめる

CREATE TABLE VARIABLES ( 
    VARIABLE_ID INT NOT NULL IDENTITY, 

    VARIABLE_NAME VARCHAR(100) NOT NULL, 

    VARIABLE_DATATYPE VARCHAR(100) NOT NULL, 

    PRIMARY KEY (VARIABLE_ID), 

    UNIQUE (VARIABLE_NAME,VARIABLE_DATATYPE) 
) 

CREATE TABLE RECORD_VALUES (
    RUN_ID INT NOT NULL REFERENCES RUNS (RUN_ID) ON DELETE CASCADE, 

    VARIABLE_ID INT NOT NULL REFERENCES VARIABLES(VARIABLE_ID) ON DELETE CASCADE, 

    RECORD_ID VARCHAR(100) NOT NULL, 

    VARIABLE_VALUE VARCHAR(1000), 

    PRIMARY KEY (RUN_ID,VARIABLE_ID,RECORD_ID) 
) 

レコード値テーブルのvariable_idは、元の入力ストリーム内の変数の一つに対応する、アドレスまたはアカウント残高が言います。 12の変数を持つ入力レコードの場合、レコード値テーブルには12行あります。

元のプロセスへの入力には、さまざまな幅と変数名のレコードが含まれます。これらは、record_valuesテーブルの名前/値タプルに分割されます。私は戻って私の現在のアプローチは、動的に実行されます(ここでは詳細は重要ではない)の特定のセットのためのユニークな変数を見つけることによって、テーブルを構築することです

run_id 
record_id (which is actually an underlying account number) 
variable_value_1 
variable_value_2 
... 
variable_value_n 

のように見えたレコードに変数を再構築する手順を書いています、テーブルを作成するSQL文字列を作成します。

私の挑戦は、元のデータからこの結果の作業表を効率的に読み込む方法です。変数の名前と数がRUN_IDで変化するので、私はこれにアプローチするために考えることができる唯一の方法は、のようなものを通じてされています。親テーブルが数百万の100年代を持っているよう

create a cursor for the list of variables 
for each variable in the list 
    create a cursor to find all the record values for that variable 
    for each record value 
     update the appropriate record/column in the work table 
    end 
end 

これは、永遠に実行しようとしています行。

宛先の行ごとに1つの更新を行うために使用できるアプローチを作成する方法について考えている人はいますか?

誰もが元のテーブルのデザインに飛びついていないので、このようにするビジネス上の理由がありました。私はそれが好きではありませんが、それを行う良い理由がありました。

お寄せいただきありがとうございます。 Oracle 10gと上記で

アンドリュー

答えて

2

SELECT DISTINCT run_id, record_id, val1, val2, ..., val12 
FROM record_values 
MODEL 
IGNORE NAV 
PARTITION BY 
     (run_id, record_id) 
DIMENSION BY 
     (variable_id) 
MEASURES 
     (val, 0 AS val1, 0 AS val2, ..., 0 AS val12) 
RULES UPDATE 
     (
     val1[ANY] = val[1], /* Put real variable ID's in the square brackets */ 
     val2[ANY] = val[2], 
     ..., 
     val12[ANY] = val[12] 
     ) 
+0

たちはOLAPコンポーネントがインストールされているように見えていない、これを試してみました。 –

+0

すべてのOracle 10gインストールの一部です(無料のXEを含む)。あなたは10gを実行してもよろしいですか? – Quassnoi

関連する問題