Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Merge SAS数据步骤合并/修改2个数据集,但仍保留主数据集上的完整性约束(pk)_Merge_Primary Key_Sas_Proc Sql_Datastep - Fatal编程技术网

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可以在数据步骤中使用。再次感谢你,基思和罗布。