0

この問題に対処するためのより簡単な方法について、誰かがアドバイスを提供できることを願っています。高度に正規化されたデータ セットのフラット ビューの作成に取り組んでいます。フラット化の目的は、通常の人がレポート作成に使用できるビューを提供することです。ソース データには、次に示すようにいくつかのテーブルが含まれています。

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 は、アドレスや口座残高など、元の入力ストリームの変数の 1 つに対応します。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 によって異なるため、これにアプローチするために私が考えることができる唯一の方法は、次のようなものです。

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 つの更新を行うために使用できるアプローチを生成する方法について、誰かが考えを持っていますか?

元のテーブルの設計に飛びつく人がないように - このようにするビジネス上の理由がありました。私はそれが好きではありませんが、そうするのには十分な理由がありました。

ご意見をお寄せいただきありがとうございます。

アンドリュー

4

1 に答える 1