最近使用Datax同步進(jìn)行定時(shí)數(shù)據(jù)同步,并在同步完之后進(jìn)行回調(diào)sql進(jìn)行統(tǒng)計(jì)操作。對(duì)應(yīng)的ORACLE表結(jié)構(gòu)如下:
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);
回調(diào)對(duì)應(yīng)的SQL如下:
MERGE INTO DATA_STAT_DAY a
USING (
SELECT
DATA_DATE,'0000' AS ID,NAME,CLASSNO, SUM(SCORES) SCORES
FROM
DATA_STAT_DAY
WHERE ID % 2 = 0
GROUP 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)
回調(diào)SQL執(zhí)行過(guò)程中,觸發(fā)了?ORA-00001: unique constaint violated 的錯(cuò)誤,其中USING部分的數(shù)據(jù)沒(méi)有重復(fù)的,并且表中也沒(méi)有和USING表中重復(fù)的,但是這里面的NAME和CLASSNO字段是有部分字段為NULL,ID部分有重復(fù)的值,然后這就導(dǎo)致了MERGE INTO的USING 關(guān)聯(lián)的ON條件的時(shí)候判斷為沒(méi)關(guān)聯(lián)上。但是在插入的時(shí)候,唯一索引判斷重復(fù)了,所以對(duì)應(yīng)的USING的數(shù)據(jù)集的ON部分的字段不能有為NULL的,否則會(huì)報(bào)唯一索引沖突的問(wèn)題。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-701168.html
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_LEVEL
? FROM (SELECT T.MGT_ORG_CODE,
? ? ? ? ? ? ? ?T.DIST_LV,
? ? ? ? ? ? ? ?T.PRNT_MGT_ORG_CODE,
? ? ? ? ? ? ? ?T.MGT_ORG_NAME
? ? ? ? ? FROM M_MGT_ORG T
? ? ? ? ?WHERE T.MGT_ORG_TYPE = 'corp'
? ? ? ? ? ?AND T.VALID_FLAG = '02') M
?START WITH M.DIST_LV = '02'
CONNECT BY NOCYCLE PRIOR M.MGT_ORG_CODE = M.PRNT_MGT_ORG_CODE
?ORDER BY M.MGT_ORG_CODE
START WITH:指定起始節(jié)點(diǎn)的條件
CONNECT BY:指定父子行的條件關(guān)系
PRIOR:查詢父行的限定符,格式:prior column1=column2 or column1=prior column2
NOCYCLE:若數(shù)據(jù)表中存在循環(huán)行,那么不添加此關(guān)鍵字會(huì)報(bào)錯(cuò),添加關(guān)鍵字后,便不會(huì)報(bào)錯(cuò),但循環(huán)的兩行只會(huì)顯示其中的第一條
循環(huán)行:該行只有一個(gè)子行,而且子行又是該行的祖先行
CONNECT_BY_ISCYCLE:前置條件:在使用了NOCYCLE之后才能使用此關(guān)鍵字,用于表示是否是循環(huán)行,0表示否,1表示是
CONNECT_BY_ISLEAF:是否是葉子節(jié)點(diǎn),0表示否,1表示是
LEVEL:level偽列,表示層級(jí),值越小層級(jí)越高,level=1為層級(jí)最高節(jié)點(diǎn)
CONNECT_BY_ROOT: 可以獲取樹(shù)形查詢根記錄的字段,start with開(kāi)始的地方被視為根節(jié)點(diǎn)。
SYS_CONNECT_BY_PATH:從start with開(kāi)始的地方開(kāi)始遍歷,并記下其遍歷到的節(jié)點(diǎn),start with開(kāi)始的地方被視為根節(jié)點(diǎn),將遍歷到的路徑根據(jù)函數(shù)中的分隔符,組成一個(gè)新的字符串。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-701168.html
到了這里,關(guān)于Oracle Merge Into ORA-00001: unique constaint violated問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!