2013-04-09 74 views
1

我的代碼如下SAS數據步合併/修改2個數據集,但仍保持完整性constrants(PK)的主數據集

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; 

我想合併的交易數據集掌握的數據集,並更新來自交易數據集的主值與價值。要做到這一點,我可以使用下面

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

代碼的結果是這樣的

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

然而,主數據集被複位,我失去了主鍵約束上的id列主數據集。

據我所知,合併,設置和更新命令創建新的數據集,而不是更新當前數據集。

修改語句是唯一一個更新當前數據集,但用上面的代碼替換合併語句與修改不起作用。

我可以通過在合併後在主數據集上恢復主約束來解決此問題,但這不是一個好的解決方案。

除此之外還有其他方法嗎?感謝您的幫助,並提前致謝。

回答

4

正如您所說,不會創建新數據集的唯一聲明是MODIFY,但您可以使用它來實現您的目標。有一個好的SUGI論文使用MODIFY 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以前回答過類似的問題。這個代碼有點不那麼通用,但更具描述性,因此可能有用。 – 2013-04-09 23:06:08

+0

感謝您的答案和非常有幫助的Sugi文章。就像Rob的回答中那樣,我不知道select可以在數據步驟中使用。再次感謝Keith&Rob。 – 2013-04-10 02:00:34