2017-06-13 124 views
0

在表格MAP_A_B_C下面是記錄例如,有900萬條記錄。使用批量收集的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的值,並且返回值爲a_target,b_target,c_target插入表中,讓我們說CLIENT_MAPPED與CLIENT_ID以及來自表MAP_A_B_C的列A,B,C的目標值。如果組合不存在,那麼它將不會進一步處理並跳過該客戶端並繼續下一次迭代。

注 - 我使用串聯('|')來使用組合,然後使用substr()從串聯字符串中查找目標值。但是,如果有更好的方法來使用集合/類型或嵌套表,這將會有所幫助。例如,當我們檢查rec_type(i).exists時,它只會將源值的indexed by列返回到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表,我不知道如果你的問題得到了解決。

如果它是一個性能問題,你可能想要把指數分別A,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) 

希望有所幫助。