2012-12-20 2 views
1

MERGE 문에 문제가 있습니다. 행이 다시 갱신되지 않고 이전 행이 다시 삽입됩니다. 다음은 HR 스키마를 사용하는 간단한 예제 코드입니다.병합 문이 행을 삽입하지만 업데이트하지 않습니다.

--CREATES A SEQUENCE FOR A HISTORY TABLE 
CREATE SEQUENCE JOBHIS_SEQ 
START WITH 1 
INCREMENT BY 1 
MINVALUE 1 
MAXVALUE 999999999999999999999999999 
NOCACHE 
NOORDER 
NOCYCLE; 

--CREATES A HISTORY TABLE 
CREATE TABLE JOBHIS ( 
ID NUMBER(10) NOT NULL, 
LOAD_DATE DATE, 
JOB_ID VARCHAR2(10) NOT NULL ENABLE, 
JOB_TITLE VARCHAR2(35) NOT NULL ENABLE, 
MIN_SALARY NUMBER(6,0), 
MAX_SALARY NUMBER(6,0), 
    CONSTRAINT JOBHIS_ID_PK PRIMARY KEY (ID) ENABLE 
) 

--this inserts 19 rows into jobhis 
MERGE INTO JOBHIS JH 
    USING ( SELECT SYSDATE AS LOAD_DATE, JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY 
      FROM JOBS 
      ) J 
    ON (JH.JOB_ID = J.JOB_ID AND JH.LOAD_DATE = J.LOAD_DATE) 
    WHEN MATCHED THEN UPDATE SET JH.MIN_SALARY = J.MIN_SALARY 
    WHERE JH.MIN_SALARY != J.MIN_SALARY 
    WHEN NOT MATCHED THEN INSERT (JH.ID, JH.LOAD_DATE, JH.JOB_ID, JH.JOB_TITLE, JH.MIN_SALARY, JH.MAX_SALARY) 
     VALUES(JOBHIS_SEQ.NEXTVAL, SYSDATE, J.JOB_ID, J.JOB_TITLE, J.MIN_SALARY, J.MAX_SALARY) 

--lets update jobs to get a row update into jobhis 
UPDATE JOBS 
SET MIN_SALARY = 10000 
WHERE JOB_ID = 'AC_ACCOUNT' 

--lets merge again 
MERGE INTO JOBHIS JH 
    USING ( SELECT SYSDATE AS LOAD_DATE, JOB_ID, JOB_TITLE, MIN_SALARY, MAX_SALARY 
      FROM JOBS 
      ) J 
    ON (JH.JOB_ID = J.JOB_ID AND JH.LOAD_DATE = J.LOAD_DATE) 
    WHEN MATCHED THEN UPDATE SET JH.MIN_SALARY = J.MIN_SALARY 
    WHERE JH.MIN_SALARY != J.MIN_SALARY 
    WHEN NOT MATCHED THEN INSERT (JH.ID, JH.LOAD_DATE, JH.JOB_ID, JH.JOB_TITLE, JH.MIN_SALARY, JH.MAX_SALARY) 
     VALUES(JOBHIS_SEQ.NEXTVAL, SYSDATE, J.JOB_ID, J.JOB_TITLE, J.MIN_SALARY, J.MAX_SALARY) 
--> 19 rows are inserted, no updates, why? Somehow LOAD_DATE does not seem to work 

--lets update jobs to back its original state 
UPDATE JOBS 
SET MIN_SALARY = 4200 
WHERE JOB_ID = 'AC_ACCOUNT' 

이러한 문이 커미트되도록 자동 커밋이 있습니다.

답변

4

당신은 당신이 하위 쿼리에서 당신이 Select Sysdate load_Date, ... from JOBS을하고 있기 때문에 업데이트하려고 할 때마다 다른 SYSDATE있을 것이다 trunc(JH.LOAD_DATE) = trunc(J.LOAD_DATE)

에 가입 시도하고이 역사 테이블에 날짜와 일치하지 않습니다.

검사에게이 SQL Fiddle를하고 TRUNC와

+0

감사를 작동, 그래, 그 이유는 있었다! – jrara

관련 문제