假设我有如下 3 个表 主表 - 10 列 表 A - 10 列 表 B - 10 列
我的要求: 主表具有值为“表 A | ”的列之一表 B”。这告诉我们需要从哪里协调数据。 (这意味着将表 A 或 B 中的列与主表进行协调)
条件: 首先将表 A 的列与主表的列进行协调。如果为空,则仅与表 B 协调
如果我理解正确的话,我们有这些表格和值的示例。相关列是str1(要调节的值)和str2(表名称,“表A|表B”)
┌────────────────┐ ┌──────────────────┐ ┌───────────────────────┐
│ Table A │ │ Table B │ │ Master │
├───────┬────────┤ ├───────┬──────────┤ ├──────┬─────────┬──────┤
│ str1 │ 9 cols │ │ str1 │ 9 cols │ │str1 │ str2 │8 cols│
┼───────┼────────┤ ├───────┼──────────┤ ├──────┼─────────┼──────┤
│ a1 │ ... │ │ b2 │ ... │ │ a1 │ aa │ ... │
│ │ │ │ │ │ │ a3 │ aa │ │
│ a3 │ │ │ b4 │ │ │ a5 │ aa │ │
│ │ │ │ │ │ │ b2 │ bb │ │
│ a5 │ │ │ b6 │ │ │ b4 │ bb │ │
│ │ │ │ │ │ │ b6 │ bb │ │
└───────┴────────┘ └───────┴──────────┘ └──────┴─────────┴──────┘
从表 A 的角度来看,我们想要添加/协调缺失值。首先,我们查看主表以查找缺失值:
select aa.str1 as tbl_a_str1, mstr.str1 as mstr_str1, mstr.str2 as mstr_str2 from aa, mstr
where aa.str1(+) = mstr.str1
┌─────────┬────────────┐
│ Table A │ Master │
├─────────┼─────┬──────┤
│ str1 │ str1│ str2 │
│ │ │ │
│ a1 │ a1 │ aa │
│ a3 │ a3 │ aa │
│ a5 │ a5 │ aa │
│ │ b2 │ bb │
│ │ b4 │ bb │
│ │ b6 │ bb │
│ │ │ │
└─────────┴─────┴──────┘
缺失值是 b2、b4 和 b6。
选项 1:仅与主数据核对
INSERT INTO aa
(SELECT str1
FROM mstr
WHERE NOT EXISTS
(SELECT str1
FROM aa
WHERE aa.str1 = mstr.str1));
选项 2:与 Master.str2 列上的指定表进行协调(在我们的示例中为表 B)
DECLARE
sql_query VARCHAR2 (1000);
BEGIN
FOR arec IN (SELECT str1 AS col_name, str2 AS table_name
FROM mstr
WHERE NOT EXISTS
(SELECT str1
FROM aa
WHERE aa.str1 = mstr.str1))
LOOP
sql_query :=
'INSERT INTO aa (SELECT str1 FROM '
|| arec.table_name
|| ' WHERE str1='''
|| arec.col_name
|| ''')';
EXECUTE IMMEDIATE sql_query;
END LOOP;
END;
/
注意:查询/脚本未针对性能进行调整。使用立即执行的动态查询也有限制,不能使用表名的绑定参数(请参阅如何使用可变表名和条件的立即执行)