2013-04-09 5 views
1

내가, 내가 데이터 집합을 마스터 할 수있는 트랜잭션 데이터 집합을 병합하려는SAS 데이터 단계 병합/2 개 데이터 세트를 수정하지만 여전히 마스터 데이터 세트

data master; 
input id name $ status $; 
datalines; 
1 B b 
2 C c 
3 A a 
;;;; 
run; 

PROC SQL; 
ALTER TABLE master 
ADD PRIMARY KEY (id); 
QUIT; 

data transaction; 
input name $ status $; 
datalines; 
A f 
F f 
E e 
D d 
B z 
C x 
;;;; 
run; 

proc sort data = master; 
by name; 
run; 

proc sort data = transaction; 
by name; 
run; 

아래로 코드가 업데이트에 대한 무결성 제한에 관한 (PK)을 유지 트랜잭션 데이터 세트의 값을 가진 마스터의 값입니다. 이를 위해, 나는 결과는 그러나이

id name status 
3 A  f 
1 B  z 
2 C  x 
4 D  d 
5 E  e 
6 F  f 

과 같을 것이다

data have; 
retain _maxID; 
merge have addon; 
by name; 
if id = . then id = _maxID + 1; 
_maxID = max(id, _maxID); 
run; 

아래의 코드를 사용할 수있는 마스터 데이터 세트가 재설정되고 난의 id 컬럼에 기본 키 제약 조건을 잃었다 마스터 데이터 세트.

내가 아는 한, 병합, 설정 및 업데이트 명령은 현재 데이터 집합을 업데이트하지 않고 새 데이터 집합을 만듭니다.

modify 문은 현재 데이터 집합을 업데이트하는 유일한 명령이지만 위 코드의 병합 문을 modify로 바꾸는 것은 작동하지 않습니다.

병합 후에 마스터 데이터 집합의 기본 제약 조건을 복원하면이 문제를 해결할 수 있지만 좋은 해결책은 아닙니다.

다른 방법이 있습니까? 도움이 감사 드리며 미리 감사드립니다.

답변

4

당신이 말했듯이, 새로운 데이터 세트를 생성하지 않는 유일한 진술은 MODIFY이지만 이것을 사용하여 목표를 달성 할 수 있습니다. MODIFY 사용에 대한 SUGI 문서가 있습니다. here

다음 코드는 사용할 수있는 코드입니다.이 예제에서 작동하는 현재 반복과 동일한 ID를 설정했으나 실제 용도에 맞는지 확인합니다.

data master; 
modify master transaction; 
by name; 
select (_IORC_); 
    when (%sysrc(_SOK)) replace; 
    when (%sysrc(_DSENMR)) do; 
     id=_n_; 
     output; 
     _error_=0; 
     end; 
    otherwise; 
end; 
run; 

자세한 대답을 제공하는 유사한 대답이 여기에 있습니다.

링크 : - similar statement to merge sql in sas

+2

키스는 내가/iorc을 수정하여 이전에 대답했던 비슷한 질문에 대한 답에 링크를 추가했다. 코드는 다소 덜 일반적이지만 더 유용하기 때문에 유용 할 수 있습니다. –

+0

답변과 매우 유용한 스기 기사를 보내 주셔서 감사합니다. Rob의 대답과 마찬가지로 Select가 데이터 단계 내에서 사용될 수 있는지 알지 못했습니다. 다시 한 번 감사드립니다, Keith & Rob. –