首页 > 解决方案 > ORACLE:如何使用使用 MAX ID 生成的手动 ID 和 Oracle Merge 语句插入查询

问题描述

我有 2 个如下表,

Master_Data_1

Id     Name
1      AAA 
2      BBB
3      DDD
4      CCC

Master_Data_2

Id     Name     Upt_Flg
1      DDD      False
2      EEE      False
3      FFF      False

两个表的 ID 相同但名称不同,并且 ID 字段既不自动递增也不排序。但是 ID 是一个不为空的主键列,它将基于 MAX ID 逻辑生成。

在这种情况下,我正在尝试使用 oracle 合并语句将 Master_Data_1 表与 Master_Data_2 表合并。

所以我在 WHEN NOT MATCHED THEN 情况下遇到问题,我试图将不匹配的记录从 master_data_1 表插入到 Master_data_2 表中。在这种情况下,Master_Data_2 表中的 ID 不会自动递增,并且我不能在此处使用源表 ID,因为它会导致唯一约束异常。

注意:我不想更改表以使 ID 自动递增或为 ID 添加序列。

Master_Data_2 表中使用合并查询的预期输出:

Id     Name     Upt_Flg
1      DDD      TRUE
2      EEE      False
3      FFF      False
4      AAA      False
5      BBB      False
6      CCC      False

有没有其他方法可以实现这一目标?

标签: oraclemergeinsert

解决方案


我想 ROW_NUMBER 分析函数可能会在这里对您有所帮助。

MERGE INTO Master_Data_2 md2
USING (SELECT (SELECT MAX(id) FROM Master_Data_2) + ROW_NUMBER() OVER(ORDER BY id) new_id
             ,name
       FROM Master_Data_1
      ) md1
ON (md2.name = md1.name)
WHEN MATCHED THEN UPDATE
                  SET Upt_flg = 'TRUE'
WHEN NOT MATCHED THEN
INSERT (md2.id, md2.name)
VALUES (Md1.new_id, md1.name);

是小提琴


推荐阅读