2012-08-12 2 views
1

Oracle에서 건설적 병합을 수행하고자합니다. 즉 원본 테이블에 일치하는 레코드가있는 경우 현재 타임 스탬프가있는 새 레코드를 대상 테이블에 추가해야합니다.병합, 일치하는 삽입시

Oracle에서 병합을 사용하여 어떻게 수행합니까? 아래는 "누락 된 키워드"오류를 제공하는 내 코드입니다.

merge into studLoad sl 
using student s 
on(s.studID=sl.studID) 
when matched 
then 
insert(sl.studID,sl.studName) 
values(s.studID||'abc',s.studName) 
when not matched 
then 
insert(sl.studID,sl.studName) 
values(s.studID,s.studName); 

또한 현재의 타임 스탬프를 studName과 함께 추가하는 방법을 알지 못합니다. 같은 제안은 환영받을 것입니다.

답변

1

이것은 병합 (Justin은 말했듯이)이 아니라 두 개의 삽입으로 이루어져야합니다. 각 경기마다 단 하나의 행 (의견에서 말한대로 중복 매치)과 학생의 모든 행. 이것은 다음과 같은 방법으로 수행 될 수 있습니다.

insert into studLoad (studID, studName, <<timestamp column>>) 
select studID, studName, systimestamp 
from student 
where studId in (
     selct studId 
     from studLoad 
    ) 
/
insert into studLoad (studID, studName) 
select studID, studName 
from student 
/

그리고이 실행 순서를 반전하지 마십시오!

1

일치 여부에 관계없이 새 행을 삽입하려는 경우 MERGE을 사용하는 것이 바람직하지 않습니다. 간단히 INSERT을하십시오. 나는 당신의 student 표는 실제로 위의 SQL 문에 <<timestamp column>> 대신 해당 열 이름을 사용 timestamp-- 전류를 저장하는 열이 있으리라 믿고있어

INSERT INTO student(studID, studName, <<timestamp column>>) 
    SELECT (CASE WHEN s.studId IS NOT NULL -- If there is a match 
       THEN <<student ID sequence>>.nextval 
       ELSE sl.studID 
      END), 
     studName, 
     (CASE WHEN s.studId IS NOT NULL -- If there is a match 
       THEN systimestamp 
       ELSE NULL 
      END) 
    FROM studLoad sl 
     LEFT OUTER JOIN student s ON (sl.studID = s.studId) 

참고.

+0

하지만 전체 소스 테이블을 확인하고 업데이트 된 모든 레코드를 확인하고 업데이트 된 레코드에 대한 새 항목을 대상 테이블에 추가하고 싶습니다. 어떻게하면 단일 삽입을 사용합니까? 나는 병합을 사용해야한다. – z22

+0

@ z22 - 죄송합니다. 이해가 안됩니다. 경기가있는 경우와 경기가없는 경우의 차이점은 무엇입니까? 게시 한 질문에서 두 경우 모두 INSERT를 수행합니다. –

+0

이 경우입니다. 레코드가 존재하지 않는 경우 삽입하십시오. 존재하는 경우이를 그대로두고 타임 스탬프와 새 대리 키와 함께 새 레코드를 삽입하십시오. – z22