2017-10-16 1 views
0

내가 오라클에 견인 사용자가 삽입 기본 키와 일치하는 데이터를 병합oracle | 행되지

  1. nsrtax = 목표 테이블에 대한 스키마가 같은

    있습니다

  • temp_nsrtax = 소스
    Name  Type   
    ---------- ------------ 
    CUSTNO  NUMBER(10)        
    EKRARYEAR NUMBER(4)        
    ESALNO  NUMBER(10)        
    EKRARDATE DATE         
    EKRARFROM DATE         
    EKRARTO DATE         
    TOTALEKRAR NUMBER(15,3)       
    TOTALSARF NUMBER(15,3)       
    EQUAL1  NUMBER(15,3)       
    DEPTNO  NUMBER(4)        
    JEBAYA  NUMBER(1)  
    USERIN  NUMBER(3)        
    USERUP  NUMBER(3)        
    PRODATE DATE         
    STATE  NUMBER(1)  
    REGNO  NUMBER(2)        
    BRNO  NUMBER(3)        
    EKRARNO NUMBER(4)        
    EKRARTYPE NUMBER(1)        
    EK_LOSS NUMBER(15,3) 
    TYPESTAXE NUMBER(10) 
    EXEMPT  NUMBER(10,3) 
    

    두 테이블 모두에 기본 키 PR_TAWTEEK primary key (CUSTNO, EKRARYEAR, ESALNO, EKRARTYPE)이 있습니다.

    난 그냥이

    MERGE INTO TA_TAWTEEK D USING (SELECT CUSTNO,EKRARYEAR,ESALNO,EKRARDATE,EKRARFROM,EKRARTO,TOTALEKRAR,TOTALSARF,EQUAL1,DEPTNO,JEBAYA,USERIN,USERUP,PRODATE,STATE,REGNO,BRNO,EKRARNO,EKRARTYPE,EK_LOSS,TYPESTAXE,EXEMPT    
    FROM temp_nsrtax.TA_TAWTEEK 
    WHERE custno=26) S 
    ON (D.custno = S.custno) 
    WHEN NOT MATCHED THEN INSERT 
    (D.CUSTNO,D.EKRARYEAR,D.ESALNO,D.EKRARDATE,D.EKRARFROM, 
    D.EKRARTO,D.TOTALEKRAR,D.TOTALSARF,D.EQUAL1,D.DEPTNO,D.JEBAYA, 
    D.USERIN,D.USERUP,D.PRODATE,D.STATE,D.REGNO,D.BRNO,D.EKRARNO, 
    D.EKRARTYPE,D.EK_LOSS,D.TYPESTAXE,D.EXEMPT) 
    VALUES(S.CUSTNO,S.EKRARYEAR,S.ESALNO,S.EKRARDATE,S.EKRARFROM 
    ,S.EKRARTO,S.TOTALEKRAR, 
    S.TOTALSARF,S.EQUAL1,S.DEPTNO,S.JEBAYA,S.USERIN,S.USERUP,S.PRODATE, 
    S.STATE,S.REGNO,S.BRNO,S.EKRARNO,S.EKRARTYPE,S.EK_LOSS,S.TYPESTAXE, 
    S.EXEMPT)S.CUSTNO,S.EKRARYEAR,S.ESALNO,S.EKRARDATE, 
    S.EKRARFROM,S.EKRARTO,S.TOTALEKRAR,S.TOTALSARF,S.EQUAL1, 
    S.DEPTNO,S.JEBAYA,S.USERIN,S.USERUP,S.PRODATE,S.STATE,S.REGNO, 
    S.BRNO,S.EKRARNO,S.EKRARTYPE,S.EK_LOSS,S.TYPESTAXE,S.EXEMPT 
    

    같은 병합 코드를 생성하지만, 내가, 내가 할 때 기본 키 열이 일치하지 않는 대상이 아닌 모든 행을 삽입해야 할 필요가 작동하지 않는 모든 행이 일치하지 않음

    내 나쁜 영어로 죄송합니다!

  • 답변

    2

    두 가지.

    먼저 MATCHEDNOT MATCHED 섹션은 USING ... ON <condition> 절의 조건과 일치합니다. 당신이 "(의 CustNo, EKRARYEAR, ESALNO, EKRARTYPE) 일치하지"말을하려는 경우, 당신은 다음과 같이 당신의 조인 조건에서 모든 열을 포함해야합니다

    MERGE INTO TA_TAWTEEK D USING (SELECT CUSTNO,EKRARYEAR,ESALNO,EKRARDATE,EKRARFROM,EKRARTO,TOTALEKRAR,TOTALSARF,EQUAL1,DEPTNO,JEBAYA,USERIN,USERUP,PRODATE,STATE,REGNO,BRNO,EKRARNO,EKRARTYPE,EK_LOSS,TYPESTAXE,EXEMPT    
    FROM temp_nsrtax.TA_TAWTEEK 
    WHERE custno=26) S 
    ON (D.custno = S.custno 
        AND D.EKRARYEAR = S.EKRARYEAR 
        AND D.ESALNO = S.ESALNO 
        AND D.EKRARTYPE = S.EKRARTYPE) 
    WHEN NOT MATCHED THEN INSERT 
    (D.CUSTNO,D.EKRARYEAR,D.ESALNO,D.EKRARDATE,D.EKRARFROM, 
    D.EKRARTO,D.TOTALEKRAR,D.TOTALSARF,D.EQUAL1,D.DEPTNO,D.JEBAYA, 
    D.USERIN,D.USERUP,D.PRODATE,D.STATE,D.REGNO,D.BRNO,D.EKRARNO, 
    D.EKRARTYPE,D.EK_LOSS,D.TYPESTAXE,D.EXEMPT) 
    VALUES(S.CUSTNO,S.EKRARYEAR,S.ESALNO,S.EKRARDATE,S.EKRARFROM 
    ,S.EKRARTO,S.TOTALEKRAR, 
    S.TOTALSARF,S.EQUAL1,S.DEPTNO,S.JEBAYA,S.USERIN,S.USERUP,S.PRODATE, 
    S.STATE,S.REGNO,S.BRNO,S.EKRARNO,S.EKRARTYPE,S.EK_LOSS,S.TYPESTAXE, 
    S.EXEMPT)S.CUSTNO,S.EKRARYEAR,S.ESALNO,S.EKRARDATE, 
    S.EKRARFROM,S.EKRARTO,S.TOTALEKRAR,S.TOTALSARF,S.EQUAL1, 
    S.DEPTNO,S.JEBAYA,S.USERIN,S.USERUP,S.PRODATE,S.STATE,S.REGNO, 
    S.BRNO,S.EKRARNO,S.EKRARTYPE,S.EK_LOSS,S.TYPESTAXE,S.EXEMPT 
    

    둘째, 당신은 단지하고있는 경우 INSERT를 사용하면 병합이 전혀 필요 없으며 구문이 더 간단합니다.

    INSERT INTO TA_TAWTEEK (CUSTNO,EKRARYEAR,ESALNO,EKRARDATE,EKRARFROM, 
    EKRARTO,TOTALEKRAR,TOTALSARF,EQUAL1,DEPTNO,JEBAYA, 
    USERIN,USERUP,PRODATE,STATE,REGNO,BRNO,EKRARNO, 
    EKRARTYPE,EK_LOSS,TYPESTAXE,EXEMPT) 
    SELECT CUSTNO,EKRARYEAR,ESALNO,EKRARDATE,EKRARFROM, 
    EKRARTO,TOTALEKRAR,TOTALSARF,EQUAL1,DEPTNO,JEBAYA, 
    USERIN,USERUP,PRODATE,STATE,REGNO,BRNO,EKRARNO, 
    EKRARTYPE,EK_LOSS,TYPESTAXE,EXEMPT    
    FROM temp_nsrtax.TA_TAWTEEK S 
    WHERE custno=26 
    AND NOT EXISTS (select 1 from TA_TAWTEEK D where D.custno = S.custno 
        AND D.EKRARYEAR = S.EKRARYEAR 
        AND D.ESALNO = S.ESALNO 
        AND D.EKRARTYPE = S.EKRARTYPE) 
    ; 
    
    관련 문제