2017-06-13 129 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) 

希望有所帮助。