与 2 个表中的主表进行列协调

问题描述 投票:0回答:1

假设我有如下 3 个表 主表 - 10 列 表 A - 10 列 表 B - 10 列

我的要求: 主表具有值为“表 A | ”的列之一表 B”。这告诉我们需要从哪里协调数据。 (这意味着将表 A 或 B 中的列与主表进行协调)

条件: 首先将表 A 的列与主表的列进行协调。如果为空,则仅与表 B 协调

oracle oracle-sqldeveloper oracle19c
1个回答
0
投票

如果我理解正确的话,我们有这些表格和值的示例。相关列是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;
/

注意:查询/脚本未针对性能进行调整。使用立即执行的动态查询也有限制,不能使用表名的绑定参数(请参阅如何使用可变表名和条件的立即执行

© www.soinside.com 2019 - 2024. All rights reserved.