2012-07-31 3 views
1

인사들 SQL을 병합 내가 유사한 문은 SAS에

만에 사스

에 두 테이블을 병합 할 필요가 SQL 병합 문에서 같은 조건 :

MERGE INTO TABLE_NAME USING table_reference ON (condition) 
WHEN MATCHED THEN 
UPDATE SET column1 = value1 [, column2 = value2 ...] 
WHEN NOT MATCHED THEN 
INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ... 

뭔가를해야만 그런 있는가?

이런 종류의 조건을 추가하려면 어떻게해야합니까?

답변

0

저는이 작업을 쉽게 수행 할 수있는 방법을 모르고 있습니다. 과거에이 작업을 수행했을 때 처음에는 새로운 행을 추가하고 (proc append 사용) 두 번째 단계는 modify 기존 행이었습니다. 수정 단계의 경우 테이블을 현재 위치로 다시 작성하려면 단일 데이터 스톰에서 setmodify 문을 사용하여 데이터 저장 조합을 사용해야합니다. 이렇게하는 것의 이점은 I/O가 훨씬 적다는 것입니다 (큰 테이블이고 작은 하위 집합 만 업데이트하는 경우). 그러면 기존 인덱스가 유지됩니다. 단점은 훨씬 더 복잡하다는 것입니다.

** 
    ** REPLACE VALUES IN CPANEL.PW_STAT WITHOUT REBUILDING THE ENTIRE TABLE. 
    *; 
    data cpanel.pw_stat; 

    set redirect_updates; 
    modify cpanel.pw_stat key=primary; 

    select(_iorc_); 
     when(%sysrc(_sok)) do; 
     * MATCHED TRANSACTION DATASET TO MASTER DATASET. REPLACE THE VALUE; 
     if date_redirected ne tmp_date_redirected then do; 
      date_redirected = tmp_date_redirected; 
      replace; 
     end; 
     end; 
     when(%sysrc(_dsenom)) do; 
     * NO MATCH. DO NOT ADD OBS OR REPLACE OBS OR DELETE OBS. RESET ERR AND DO NOTHING.; 
     _error_ = 0; 
     end; 
     otherwise do; 
     put 'ERROR: Unexpected value for _IORC_= ' _iorc_; 
     put 'Program terminating. DATA step iteration # ' _n_; 
     put _all_; 
     stop; 
     end; 
    end; 
    run; 

나는 성능이 오프 더 나은 문제가되지 않는 경우 단지 추가해야 처음부터 테이블을 다시 작성 : 코드는 다음과 같이 보입니다.

+0

얘들 아 미안 내가 ... –

+0

그러나 나는 당신의 접근 방식을 시도 할 것이다 ... 나는 다른 방법으로 모든 일을 내 probelm를 해결 한 도움을 주셔서 대단히 감사합니다 ... 내가 밖으로했다 멀리왔다 그래, 내가 생각했던 것과 매우 비슷하다고 생각해. 나는 데이터 단계에서 select를 사용할 수 있는지 몰랐다. –

+0

당신에게 –

1

MODIFY를 사용하여 새 행을 삽입하고 기존 데이터를 바꿀 수 있습니다. 코드는 다음과 같이 보일 것입니다 (나는 당신이 무엇에 매치되는지 그리고 당신이 가질 수있는 다른 조건을 알지 못하면 더 구체적 일 수 없습니다). 경고의 한마디로 두 데이터 세트 모두 큰 경우이 방식으로 MODIFY를 사용하면 트랜잭션 데이터 세트의 각 행에 대해 마스터 데이터 세트에 대해 개별 조회가 수행되므로 매우 비효율적입니다. @ Rob의 솔루션 에서처럼 색인을 사용하면이 경우 성능이 향상됩니다. @ Rob이 말했듯이, 대안은 대신에 수정하지 않고 기존 데이터 세트를 대체하는 UPDATE (여기서는 MODIFY와 유사) 또는 표준 MERGE를 사용하는 것입니다. 마지막 옵션은 현재 코드와 비슷한 것을 사용할 수있는 곳에서 PROC SQL을 사용하는 것입니다.

data master; 
modify master (in=a) transaction (in=b); 
by id; 
if not a and <condition> then do; 
    _error_=0; 
    output; 
    end; 
else if a and b and <condition> then replace; 
run;