sql - 决赛 table 的合并相当于什么?

标签 sql db2 db2-luw

我正在尝试使用合并来仅插入新记录。我想收集插入的新记录的 ID 以及被忽略的重复记录的 ID。

这是表的创建语句:

drop table SSZ_ME_MIS.test_update_table;
create table ssz_me_mis.test_update_table (
    ID_col int not null generated always as identity, -- Primary Key
    val_col_1 int not null,
    val_col_2 varchar(255) not null,
    constraint pk_test_update_table primary key (ID_col),
    constraint uq_test_update_table unique (val_col_1, val_col_2)
);

然后,填充一些初始值:

insert into ssz_me_mis.test_update_table (val_col_1, val_col_2)
select *
from (values 
    (231, 'Value 1'),
    (481, 'Value 2'),
    (813, 'Value 3')
);

所以,最后,我想尝试进行这种插入:

select ID_col from final table (
    merge into ssz_me_mis.test_update_table t using (
        select *
        from (values 
            (231, 'Value 1'),
            (481, 'Value 2'),
            (513, 'Value 4')
        )
    ) as s (val_col_1, val_col_2)
    on
        t.val_col_1 = s.val_col_1
        and t.val_col_2 = s.val_col_2
    when not matched then 
        insert (val_col_1, val_col_2)
        values (s.val_col_1, s.val_col_2)
    else
        ignore
);

有什么办法可以实现这一点吗?

最佳答案

类似的东西将在 Db2 LUW 上运行(假设您使用的是 ORGANIZE BY ROW 表)。

with s (val_col_1, val_col_2) AS  (values 
            (231, 'Value 1'),
            (481, 'Value 2'),
            (513, 'Value 4')
        )
, i as (select * from final table(
    INSERT INTO ssz_me_mis.test_update_table ( val_col_1 , val_col_2) 
     select * from s where not exists (select 1 from ssz_me_mis.test_update_table t
        where 
        t.val_col_1 = s.val_col_1
        and t.val_col_2 = s.val_col_2
        )
))
, u as (select count(*) as dummy from new table(
    update ssz_me_mis.test_update_table t
    set val_col_1 = (select val_col_1 from s where t.val_col_1 = s.val_col_1 and t.val_col_2 = s.val_col_2)
    ,   val_col_2 = (select val_col_2 from s where t.val_col_1 = s.val_col_1 and t.val_col_2 = s.val_col_2)
    where exists    (select val_col_2 from s where t.val_col_1 = s.val_col_1 and t.val_col_2 = s.val_col_2)
))
select ID_col from i, u

我包含了一个用于更新的分支,但从逻辑上讲,您需要一些非键列才能有意义。您的示例只是实践中的 INSERT,所以我有点困惑为什么您要使用 MERGE

关于sql - 决赛 table 的合并相当于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51619437/

相关文章:

php - 在 SQL 中选择列值作为列标题?

sql - 在 Oracle 11g 中使用 SDO 几何创建物化 View 时无法使用 ORDER BY

mysql - 转换Mysql中的查询

validation - 比较不同服务器上2个不同数据库之间数据的最佳方法

c# - 如果在 DB2 中超过分配的时间,则终止 SQL 查询执行

db2 - TABLE 与 TABLESPACE,有什么区别?

db2 - 如何从用户组中获取Db2用户列表?

php - "x = ?"在 SQL 查询条件下意味着什么?

c# - 通过 .NET DbConnection 连接到 DB2

sql - 无效的操作结果集被关闭 errorcode 4470 sqlstate null - DB2 数据提取