oracle - 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
有没有其他方法可以实现这一目标?
解决方案
我想 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);
这是小提琴
推荐阅读
- angular - 可观察类型中不存在 Angular 7 属性“共享”
- c# - 谷歌“GoogleWebAuthorizationBroker”显示错误重定向 uri 不匹配
- javascript - 如何在不删除父标签ckeditor的情况下删除文本
- python - 芹菜不作为守护进程运行
- phpspreadsheet - 如何使用phpspreadsheet锁定特定单元格
- macos - 哦,我在 OSX 上的 ZSH Docker 自动完成功能无法正常工作
- ruby-on-rails - 如何使用friendly_id和历史设置Rails多态模型
- typescript - 为什么我的 Typescript 对象允许这个额外的属性?
- python - 如何解决“bash:cd:/home/pi/AIY-projects-python:没有这样的文件或目录”?
- c++ - boost协程的堆栈大小是多少?