PLSQL集合与批量收集

时间:2017-06-13 16:25:29

标签: oracle plsql

在下表MAP_A_B_C中是记录,例如,有900万条记录。

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_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_MAPPED具有CLIENT_ID,并且表MAP_A_B_C中的列A,B,C的目标值。如果组合不存在,那么它将不会进一步处理并跳过该客户端并继续下一次迭代。

注意 - 我使用连接('|')来使用组合,然后使用substr()从连接字符串中查找目标值。但是,如果有更好的方法来使用集合/类型或嵌套表,那将会很有帮助。例如,当我们检查rec_type(i).exists时,它只返回源值的索引列到1到1的目标。这里我的意图是如果我们可以创建3X3矩阵并检查存在。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

获取地图表中存在的所有客户端:

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

但您也可以通过加入它们来创建CLIENT_MAPPED表

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)

玩弄它,我不确定你的问题是否正确。

如果是性能问题,您可能希望分别在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)

希望有所帮助。