Merge SAS数据步骤合并/修改2个数据集,但仍保留主数据集上的完整性约束(pk)
我的代码如下Merge SAS数据步骤合并/修改2个数据集,但仍保留主数据集上的完整性约束(pk),merge,primary-key,sas,proc-sql,datastep,Merge,Primary Key,Sas,Proc Sql,Datastep,我的代码如下 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
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列上的主键约束
据我所知,merge、set和update命令创建新数据集,而不是更新当前数据集
modify语句是唯一更新当前数据集的语句,但是用modify替换上面代码中的merge语句不起作用
我可以通过在合并后恢复主数据集上的主要约束来解决这个问题,但这不是一个好的解决方案
还有别的办法吗?感谢您的帮助。正如您所说,唯一不会创建新数据集的语句是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;
这里有一个类似的问题,给出了更多细节
链接:-正如您所说,唯一不创建新数据集的语句是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;
这里有一个类似的问题,给出了更多细节
链接:-Keith我在您的答案中添加了一个链接,该链接指向我之前使用modify/iorc回答的类似问题。代码不太通用,但更具描述性,因此可能很有用。感谢您的回答和非常有用的Sugi文章。就像Rob回答中的一样,我不知道select可以在数据步骤中使用。再次感谢Keith&Rob。Keith我在您的答案中添加了一个链接,指向我以前使用modify/iorc回答的类似问题。代码不太通用,但更具描述性,因此可能很有用。感谢您的回答和非常有用的Sugi文章。就像Rob回答中的一样,我不知道select可以在数据步骤中使用。再次感谢你,基思和罗布。