当前位置: 首页 > news >正文

Oracle Merge Into ORA-00001: unique constaint violated问题

最近使用Datax同步进行定时数据同步,并在同步完之后进行回调sql进行统计操作。对应的ORACLE表结构如下:

create table DATA_STAT_DAY (
DATA_DATE DATE, 
ID VARCHAR2(2), 
NAME VARCHAR2(2),
CLASSNO VARCHAR2(2),
SCORES NUMBER(16,0)
);CREATE UNIQUE INDEX IDX_DATA_STAT_DAY ON DATA_STAT_DAY(DATA_DATE, ID, NAME, CLASSNO);

回调对应的SQL如下:

MERGE INTO DATA_STAT_DAY a
USING (SELECT DATA_DATE,'0000' AS ID,NAME,CLASSNO, SUM(SCORES) SCORESFROM DATA_STAT_DAY WHERE ID % 2 = 0GROUP BY DATA_DATE,NAME,CLASSNO
) b 
ON (a.DATA_DATE = b.DATA_DATE and a.ID = b.ID and a.NAME = b.NAME and a.CLASSNO = b.CLASSNO)
WHEN MATCHED THEN UPDATE SET a.SCORES = b.SCORES
WHEN NOT MATCHED THEN INSERT INTO (a.DATA_DATE,a.ID,a.NAME,a.CLASSNO,a.SCORES)VALUES (b.DATA_DATE,b.ID,b.NAME,b.CLASSNO,b.SCORES)

回调SQL执行过程中,触发了 ORA-00001: unique constaint violated 的错误,其中USING部分的数据没有重复的,并且表中也没有和USING表中重复的,但是这里面的NAME和CLASSNO字段是有部分字段为NULL,ID部分有重复的值,然后这就导致了MERGE INTO的USING 关联的ON条件的时候判断为没关联上。但是在插入的时候,唯一索引判断重复了,所以对应的USING的数据集的ON部分的字段不能有为NULL的,否则会报唯一索引冲突的问题。

ORACLE的递归查询

SELECT M.MGT_ORG_CODE,LPAD(' ', LEVEL * 2, ' ') || M.MGT_ORG_NAME AS MGT_ORG_NAME,M.PRNT_MGT_ORG_CODE,SYS_CONNECT_BY_PATH(M.MGT_ORG_CODE, '>') AS CODE_PATH,REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(M.MGT_ORG_CODE, '>'),'[^>]+',1,1,'i') AS MGT_ORG_C1,REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(M.MGT_ORG_CODE, '>'),'[^>]+',1,2,'i') AS MGT_ORG_C2,REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(M.MGT_ORG_CODE, '>'),'[^>]+',1,3,'i') AS MGT_ORG_C3,REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(M.MGT_ORG_CODE, '>'),'[^>]+',1,4,'i') AS MGT_ORG_C4,REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(M.MGT_ORG_CODE, '>'),'[^>]+',1,5,'i') AS MGT_ORG_C5,REGEXP_SUBSTR(SYS_CONNECT_BY_PATH(M.MGT_ORG_CODE, '>'),'[^>]+',1,6,'i') AS MGT_ORG_C6,CONNECT_BY_ROOT(M.MGT_ORG_CODE) AS ROOT_CODE_VAL,CONNECT_BY_ISLEAF AS ISLEAF,M.DIST_LV,'0' || (LEVEL + 1) AS MGT_LEVELFROM (SELECT T.MGT_ORG_CODE,T.DIST_LV,T.PRNT_MGT_ORG_CODE,T.MGT_ORG_NAMEFROM M_MGT_ORG TWHERE T.MGT_ORG_TYPE = 'corp'AND T.VALID_FLAG = '02') MSTART WITH M.DIST_LV = '02'
CONNECT BY NOCYCLE PRIOR M.MGT_ORG_CODE = M.PRNT_MGT_ORG_CODEORDER BY M.MGT_ORG_CODE

START WITH:指定起始节点的条件
CONNECT BY:指定父子行的条件关系
PRIOR:查询父行的限定符,格式:prior column1=column2 or column1=prior column2
NOCYCLE:若数据表中存在循环行,那么不添加此关键字会报错,添加关键字后,便不会报错,但循环的两行只会显示其中的第一条
循环行:该行只有一个子行,而且子行又是该行的祖先行
CONNECT_BY_ISCYCLE:前置条件:在使用了NOCYCLE之后才能使用此关键字,用于表示是否是循环行,0表示否,1表示是
CONNECT_BY_ISLEAF:是否是叶子节点,0表示否,1表示是
LEVEL:level伪列,表示层级,值越小层级越高,level=1为层级最高节点
CONNECT_BY_ROOT: 可以获取树形查询根记录的字段,start with开始的地方被视为根节点。
SYS_CONNECT_BY_PATH:从start with开始的地方开始遍历,并记下其遍历到的节点,start with开始的地方被视为根节点,将遍历到的路径根据函数中的分隔符,组成一个新的字符串。

http://www.lryc.cn/news/156042.html

相关文章:

  • javaScript:DOM中的CSS操作
  • 2023最新UI工作室官网个人主页源码/背景音乐/随机壁纸/一言
  • 常用命令之mysql命令之show命令
  • iOS接入IJKPlayer遇到的问题汇总
  • 【LeetCode题目详解】第八章 贪心算法 part06 738.单调递增的数字 968.监控二叉树 (day37补)
  • 代码随想录算法训练营Day48 | 198.打家劫舍,213.打家劫舍II,337.打家劫舍III | Day 20 复习
  • Spring Boot @Validated 和Javax的@Valid配合使用
  • 论文复现--lightweight-human-pose-estimation-3d-demo.pytorch(单视角多人3D实时动作捕捉DEMO)
  • 在Windows下设置将EXE开机自启动
  • 反序列化漏洞及漏洞复现
  • 软件工程笔记001
  • java进行系统的限流实现--Guava RateLimiter、简单计数、滑窗计数、信号量、令牌桶
  • 《86盒应用于家居中控》——实现智能家居的灵动掌控
  • 【LeetCode】328. 奇偶链表
  • 数字城市:科技革命下的未来之城
  • Qt鼠标点击事件处理:按Escape键退出程序
  • P1162 填涂颜色
  • Vagrant命令
  • vue3+pinia实现动态类名及动态颜色
  • CSS实现隐藏滚动条但可以滚动
  • Ceph入门到精通-lunix将文本5行合成1行并按列统计
  • linux线程讲解
  • 解决本地jar包导入maven
  • ArcGis地图
  • Chrome 和 Edge 上出现“status_breakpoint”错误解决办法
  • 华为AP升级操作记录
  • 面试系列 - String字符串使用详解
  • 1782_Adobe Reader X实现pdf分页保存
  • 筛选图片,写JSON文件和复制
  • C++并发编程:构建线程安全队列(第二部分:细粒度锁)