2017-10-16 1 views
0

I ont les utilisateurs de remorquage dans l'oracleoracle | fusionner les données où ligne correspond pas à la clé primaire insérée

  1. nsrtax = cible
  2. temp_nsrtax = Source

le schéma pour les tables sont les mêmes

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) 

il est PR_TAWTEEK primary key (CUSTNO, EKRARYEAR, ESALNO, EKRARTYPE) clé primaire dans les deux tables

je viens de créer le code de fusion comme celui-ci

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 

mais il ne fonctionne pas comme je l'ai besoin, je dois insérer toutes les lignes dans la cible où les colonnes de clé primaire ne correspond pas, pas quand tout Les lignes ne correspondent pas

Désolé pour mon mauvais anglais!

Répondre

2

Deux choses. D'abord, les sections MATCHED et NOT MATCHED correspondent à la condition de la clause USING ... ON <condition>. Donc, si vous voulez dire « pas apparié (CustNo, EKRARYEAR, ESALNO, EKRARTYPE) », vous devez inclure toutes les colonnes de votre condition de jointure, comme ceci:

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 

Deuxièmement, si vous faites seulement un INSERT, alors vous n'avez pas besoin d'une fusion du tout, et la syntaxe est plus simple:

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) 
;