Oacle 데이터 가 merge into 와 일치 하 는 인 스 턴 스 상세 설명

3612 단어
Oacle 데이터 가 merge into 와 일치 하 는 인 스 턴 스 상세 설명
선언:
 오래 전 까지 만 해도 2010 년 쯤 에 Oralce 를 사용 할 것 으로 예상 되 었 다. 그 당시 에 한 가지 수요 가 있 었 던 것 은 두 표 의 데 이 터 를 일치 시 켜 야 한 다 는 것 이 었 다. 이 두 표 의 데이터 구 조 는 일치 하고 하 나 는 정식 표 이 며 하 나 는 임시 표 이 며 이 두 표 의 데 이 터 는 비교적 큰 수백 M 이 라 고 할 수 있다.업무 수 요 는 임시 표 의 데이터 와 정식 표 의 일치 로 모든 필드 가 일치 해 야 하고 두 표 에 홈 키 가 없 는 것 은 비교적 번 거 롭 고 나 쁜 일이 다.
필드:
1. 두 표 의 모든 필드 값 이 일치 하면 처리 하지 않 습 니 다.2. 일부 필드 가 일치 하지 않 으 면 업데이트 합 니 다.3. 정식 표 에 데이터 가 임시 표 에 존재 하지 않 으 면 삭제 해 야 합 니 다.
위의 장면 의 세 가지 기능 을 만족 시 키 면 됩 니 다. 예 를 들 어 (자바, C, C \ #) 등 여러 가지 로 실현 할 수 있 고 저장 과정 Oacle 로 실현 할 수 있 습 니 다.
고려 한 후에 프로그램 으로 하 는 것 은 분명 실현 할 수 있 지만 번 거 로 운 데이터 읽 기, sql 조작 을 제외 하고 일치 해 야 하 며 효율 도 문제 입 니 다.저장 프로 세 스 로 구현 하기 로 결 정 했 습 니 다. 이전 에는 if exists 를 사용 하여 일치 합 니 다.뒤에 효율 이 높 지 않 고 느 린 것 을 발견 했다.후속 개선 후 Oracle merge into 를 도입 하여 실현 합 니 다.
구체 적 인 사례 코드 (필드 에서 대부분 삭제) 는 다음 과 같다.
1. 임시 표 LTABLE 의 데이터 와 정식 표 ZTABLE 비교, 각 필드 값 이 같 지 않 으 면 임시 표 의 이 줄 데이터 가 새로 추 가 된 것 이 라 고 생각 하고 정식 표 에 삽입 합 니 다.

merge into Z_TABLE t1  
 using (  
   select   
     S_SYSTEM_ID,  
     S_PORT_ID,  
     S_SYSTEM_NAME  
  where S_SYSTEM_NAME = "  "  
  from L_TABLE  
 ) t2  
 on(  
 t1.S_PORT_ID=t2.S_PORT_ID and t1.S_SYSTEM_ID=t2.S_SYSTEM_ID and nvl(t1.S_SYSTEM_NAME,'1')=nvl(t2.S_SYSTEM_NAME,'1')  
 )  
 WHEN NOT matched THEN  
 INSERT (  
  S_SYSTEM_ID,  
  S_PORT_ID,  
  S_SYSTEM_NAME  
  )   
  VALUES (  
  t2.S_SYSTEM_ID, t2.S_PORT_ID,t2.S_SYSTEM_NAME  
  )  

주:
1) 위의 코드 on (nvl (t1. S SYSTEM NAME, '1') = nvl (t2. S SYSTEM NAME, '1') 은 nvl 함 수 를 사 용 했 습 니 다. 이 곳 은 특히 주의해 야 합 니 다. 처음에 테스트 할 때 일부 필드 가 비어 있 는 것 을 발 견 했 습 니 다. null 과 null 은 이전에 똑 같이 처리 할 수 없 었 기 때문에 null 또는 '' '' '입 니 다.필드 가 일치 하 는 문자열 로 통일 되 어 있 습 니 다. 같 지 않 으 면 일치 하지 않 는 문제 가 발생 할 수 있 습 니 다.
2) 임시 표를 조회 할 때 where S SYSTEM NAME = "광동" 에 조건 제약 조건 을 붙 였 다.; 이전의 처 리 는 전량 이 었 다. 전체 큰 시 계 를 조회 한 후에 효율 이 매우 완벽 하지 않다 는 것 을 발견 했다. 조건 을 넣 고 판단 한 후에 매번 소량의 데이터 만 가서 정식 표 와 일치 하 는 것 과 같다. 그러면 데이터 베이스 임시 공간의 부담 을 줄 이 고 몇 개의 도시 성 을 순환 해서 각각 하면 속 도 를 가속 화 할 수 있다.
2. 정식 표 의 Z TABLE 에 남아 있 는 데 이 터 를 삭제 하고 마지막 으로 임시 표 와 정식 표 의 데 이 터 량 이 같 습 니 다.
이전 1 단계 에 한 줄 의 데이터 필드 가 다 르 면 업데이트 가 아 닌 한 줄 의 데 이 터 를 다시 삽입 하기 때문에 정식 표 에 남 은 데이터, 즉 임시 표 와 완전히 다른 데 이 터 를 추가 합 니 다.

merge into Z_TABLE t1  
 using (  
   select S_SYSTEM_ID, S_PORT_ID,S_SYSTEM_NAME from Z_TABLE  
 minus  
   select S_SYSTEM_ID, S_PORT_ID,S_SYSTEM_NAME from L_TABLE  
 ) t2  
 on (  
 t1.S_PORT_ID=t2.S_PORT_ID and t1.S_SYSTEM_ID=t2.S_SYSTEM_ID and nvl(t1.S_SYSTEM_NAME,'1')=nvl(t2.S_SYSTEM_NAME,'1')  
 )  
 when matched then  
  update set t1.additionalInfo = 'del'  
  delete WHERE t1.additionalInfo = 'del' 

위의 sql 은 정식 표 와 임시 표 의 차이 데이터 (각 필드 값 의 차이 포함) 를 선택 하 는 것 을 의미 합 니 다. 여 기 는 Oracle 의 minus 함수 로 선택 하 였 습 니 다. 사실은 이 부분 은 삭제 해 야 할 데이터 입 니 다. 이 부분 데이터 집합 을 정식 표 와 일치 시 키 고 정식 표 에 존재 하면 삭제 표 지 를 업데이트 하여 삭제 합 니 다. 
주:
두 표 모두 메 인 키 가 없 기 때문에 삭제 근거 로 유일한 판단 을 사용 할 수 없습니다. 또한 merge into 의 문 구 는 delete 가 update 이후 에 따라 야 한 다 는 점 을 테스트 했 기 때문에 정식 표 에 확장 필드 addition alInfo 를 추가 하여 삭제 할 수 있 는 표 시 를 추가 할 수 밖 에 없습니다.
상기 두 단 계 를 통 해 정식 표 와 임시 표 의 데이터 가 동기 화 되 었 습 니 다!
궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 의 커 뮤 니 티 에 가서 토론 을 교류 하 세 요. 읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다. 본 사이트 에 대한 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기