【问题标题】:How will I be able to validate the column value from the table and merge into the another table我将如何验证表中的列值并合并到另一个表中
【发布时间】:2022-01-07 19:42:04
【问题描述】:
CREATE TABLE c_file (
    e_id   NUMBER(10),
    ac_ec  VARCHAR2(100),
    constraint pk_c_file primary key(e_id)
);

insert into c_file values(1,'A');
insert into c_file values(2,'A');
insert into c_file values(3,'E');
insert into c_file values(4,'A');
insert into c_file values(5,'E');

CREATE TABLE e_staging (
    e_id   NUMBER(10),
    ac_ec  VARCHAR2(100)
);

insert into e_staging values(1,null);
insert into e_staging values(2,null);
insert into e_staging values(3,null);
insert into e_staging values(4,null);
insert into e_staging values(5,null);
insert into e_staging values(6,null);
insert into e_staging values(7,null);
insert into e_staging values(8,null);
insert into e_staging values(9,null);
insert into e_staging values(10,null);

CREATE TABLE e_details (
    e_id   NUMBER(10),
    ac_ec  VARCHAR2(100)
);

合并:

MERGE INTO e_details m
USING (
          SELECT
              e_id,
              ac_ec
          FROM
              e_staging
      )
s ON ( m.e_id = s.e_id )
WHEN MATCHED THEN UPDATE
SET m.ac_ec = s.ac_ec
WHEN NOT MATCHED THEN
INSERT (
    e_id,
    ac_ec )
VALUES
    ( s.e_id,
      s.ac_ec );

问题:

通过此合并,它将加载 e_staging 表中的所有数据,但在加载时 如果 e_id 存在于 c_file 和 e_staging 表中,它应该将 e_id 检查到 c_file 表中 如果 e_id 在 e_staging 中不存在,那么它应该根据 c_file ac_ec 列更新 ac_ec 列 它应该更新为“E”。

当前输出:

预期输出:

对于 e_id 1 - 从 e_staging 表加载到 e_details 表时。它应该检查 c_file 表。如果存在 e_id,则应将 ac_ec 列更新为 A。 直到 5 岁的所有 e_id 也是如此。

从 e_id 6 到 10。c_file 中不存在这些值,因此将值更新为“E”。

工具:SQL Developer 版本:20.4

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    MERGE 语句的USING 块中加入c_file。

    MERGE INTO e_details m
    USING (
            SELECT
                e.e_id,
                NVL(c.ac_ec,'E') AS ac_ec
            FROM
                e_staging e LEFT OUTER JOIN c_file c ON e.e_id = c.e_id  
          )
    s ON ( m.e_id = s.e_id )
    WHEN MATCHED THEN UPDATE
    SET m.ac_ec = s.ac_ec
    WHEN NOT MATCHED THEN
    INSERT (
        e_id,
        ac_ec )
    VALUES
        ( s.e_id,
          s.ac_ec );
    

    【讨论】:

    • 感谢它对我有用。你能解释一下为什么我们使用左外连接
    • 左连接是因为您希望在结果集中为 e_staging 中的每一行保留一行。您不需要内连接(仅存在于两个表中的行)或右连接(c_file 中的所有行,即使它们在 e_staging 中不存在)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2017-12-21
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    相关资源
    最近更新 更多