1

由于缺乏完整性检查,我目前有一个跨主键列有多个重复的表。尽管如此,我正在尝试删除重复项。问题是,没有id列,这意味着查找重复项并非易事。

我当前的解决方案涉及使用该count(*)... having构造创建第二个表,并选择要删除的行。我的问题是 SASdelete命令不允许以下操作:

proc sql;
delete from TableA
where (v1,v2,v3) in TableB

有没有办法根据另一个表的内容从一个表中删除?

4

3 回答 3

2

如果我理解正确,您希望从数据集中删除每个观察值,其中多个观察值具有相同的“关键”变量值(删除所有重复项)。

使用 SAS 做到这一点的最佳和最简单的方法是按您的“关键”变量对该数据集进行排序,然后使用另一个数据步骤来创建新副本。解释比说明更难:

data have;
   input x y z;
   datalines4;
1 2 3
1 2 3
2 3 4
3 4 5
3 4 6
3 4 7
4 5 6
4 5 6
;;;;
run;

proc sort data=have;
   by x y z;
run;

data want;
   set have;
      by x y z;
   if  first.z and last.z;
run; 

子设置语句仅使用您使用语句时创建的自动和变量IF保留四个“唯一”观察结果。FIRST.LAST.BY

相反,如果您想保留其中一个副本,则可以使用以下NODUPKEY选项PROC SORT

proc sort nodupkey data=have out=want2;
   by x y z;
run;

这将消除示例中的两个观察结果,为您的键留下唯一值。您无法控制使用此技术保留哪些观察结果。

于 2013-06-18T19:59:49.197 回答
1

您可以使用相关子查询执行此操作:

proc sql;
delete from TableA
    where exists (select 1
                  from TableB
                  where b.pk = TableA.v1 or b.pk = TableA.v2 or b.pk = TableA.v3
                 )
于 2013-06-18T19:28:46.897 回答
1

尝试这个:

proc sql;
delete from TableA as a
where a.v1 = (select b.v1 from TableB as b where a.primaryKey = b.foreignKeyForTableA)

对于其他值,依此类推。但是,由于您可能会从 TableB 收到重复项(即多个结果),您可能想尝试“选择不同的”或“选择前 1 个”以仅获得一个结果。

于 2013-06-18T19:23:50.163 回答