由于缺乏完整性检查,我目前有一个跨主键列有多个重复的表。尽管如此,我正在尝试删除重复项。问题是,没有id
列,这意味着查找重复项并非易事。
我当前的解决方案涉及使用该count(*)... having
构造创建第二个表,并选择要删除的行。我的问题是 SASdelete
命令不允许以下操作:
proc sql;
delete from TableA
where (v1,v2,v3) in TableB
有没有办法根据另一个表的内容从一个表中删除?
由于缺乏完整性检查,我目前有一个跨主键列有多个重复的表。尽管如此,我正在尝试删除重复项。问题是,没有id
列,这意味着查找重复项并非易事。
我当前的解决方案涉及使用该count(*)... having
构造创建第二个表,并选择要删除的行。我的问题是 SASdelete
命令不允许以下操作:
proc sql;
delete from TableA
where (v1,v2,v3) in TableB
有没有办法根据另一个表的内容从一个表中删除?
如果我理解正确,您希望从数据集中删除每个观察值,其中多个观察值具有相同的“关键”变量值(删除所有重复项)。
使用 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;
这将消除示例中的两个观察结果,为您的键留下唯一值。您无法控制使用此技术保留哪些观察结果。
您可以使用相关子查询执行此操作:
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
)
尝试这个:
proc sql;
delete from TableA as a
where a.v1 = (select b.v1 from TableB as b where a.primaryKey = b.foreignKeyForTableA)
对于其他值,依此类推。但是,由于您可能会从 TableB 收到重复项(即多个结果),您可能想尝试“选择不同的”或“选择前 1 个”以仅获得一个结果。