2017-06-13 15 views
0

以下のMAP_A_B_Cの表には、たとえば9,000,000件のレコードがあります。バルク収集を使用するPLSQL収集

MAP_A_B_C

a_source,b_source,c_source,a_target,b_target,c_target 
1001,235,5001,12,1,1 
1001,235,5002,11,2,2 
1001,236,6012,23,3,1 
1002,235,5001,11,2,100 
1002,237,5002,32,1,1 
1003,239,6012,21,1,5 
1003,236,6012,11,3,4 

CLIENT

CLIENT_ID, A, B, C 
9001,1OO1,235,5001 
9002,1003,238,6012 
9003,1002,235,5001 
9004,1003,236,6013 

今、何が必要か?

クライアントの場合、CLIENTテーブルのa_source、b_source、c_sourceを知っていれば、その組み合わせがMAP_A_B_Cに存在するかどうかを確認したい場合は、存在する場合はそれぞれa_target、b_target、c_targetの値を返します。テーブルに挿入すると、CLIENT_IDとCLIENT_MAPPEDを指定し、テーブルMAP_A_B_Cの列A、B、Cの値をターゲットとします。その組み合わせが存在しない場合、そのクライアントはさらに処理されず、スキップされ、次の反復に進む。

注 - 結合を使用するには連結( '|')を使用し、連結文字列からターゲット値を検索するにはsubstr()を使用しました。ただし、コレクション/型またはネストした表を使用する方が良い方法があれば、参考になります。たとえば、rec_type(i).existsをチェックすると、ソース値のインデックス付き列が1対1のターゲットに返されます.3X3行列を作成してその存在を確認できるかどうかが私の意図です。

お手数をおかけします。マップテーブルに存在するすべてのクライアントを取得するには

答えて

1

SELECT * 
FROM CLIENT 
WHERE 
(a, b, c) in (SELECT a_source, b_source, c_source 
       FROM MAP_A_B_C) 

をしかし、あなたはちょうど

INSERT INTO CLIENT_MAPPED 
    SELECT CLIENT_ID, a_target, b_target, c_target 
    FROM CLIENT 
    JOIN MAP_A_B_C ON (a_source = a and b_source = b and c_source = c) 

はそれで遊んでみてくださいそれらを結合してもCLIENT_MAPPEDテーブルを作成することができ、私はわかりませんもしあなたの質問が正しければ。

それはあなたがそれぞれ、b、c及びa_source、b_source、C_SOURCEにインデックスを配置する場合がありますパフォーマンスの問題がある場合は、次の新しいテーブルの上に

CREATE INDEX CLIENT_ABC_IDX ON CLIENT (A, B, C); 
CREATE INDEC MAP_A_B_C_ABC_IDX ON MAP_A_B_C (a_source, b_source, c_source); 

あなたはまた、テーブルの右を作成行うことができますが、出席の外:

CREATE TABLE CLIENT_MAPPED AS 
    SELECT CLIENT_ID, a_target, b_target, c_target 
    FROM CLIENT 
    JOIN MAP_A_B_C ON (a_source = a and b_source = b and c_source = c) 

希望することができます。