1

私は以下のようなコードを持っています

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

1 に答える 1

4

あなたが言ったように、新しいデータセットを作成しない唯一のステートメントは MODIFY ですが、これを使用して目的を達成できます。MODIFY の使用に関する優れた SUGI 論文がここにあります

使用できるコードは次のとおりです。この例で機能する現在の反復と同じになるように 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;

追加の詳細を提供する同様の回答済みの質問がここにあります。

リンク:- sas で SQL をマージする同様のステートメント

于 2013-04-09T09:02:43.937 に答える