在SAS中连接两个数据集的替代方法

时间:2015-03-06 15:49:24

标签: join sas

我有两个数据集DS1DS2DS1是100,000rows x 40cols,DS2是20,000rows x 20cols。如果某些字段与COL1匹配,我实际上需要从DS1提取DS2。 由于我对SAS非常新,我试图坚持SQL逻辑。

基本上我做了(拍摄版)

proc sql;
...
SELECT DS1.col1 
FROM DS1 INNER JOIN DS2 
on DS1.COL2=DS2.COL3 
OR DS1.COL3=DS2.COL3 
OR DS1.COL4=DS2.COL2
...

一个小时左右后,它仍然在运行,但是我收到了来自SAS的电子邮件,我正在使用700g左右。是否有更好,更快的SAS方式进行此操作?

3 个答案:

答案 0 :(得分:3)

我会使用3个单独的查询并使用UNION

proc sql;
...
SELECT DS1.col1 
FROM DS1 INNER JOIN DS2 
on DS1.COL2=DS2.COL3 

UNION

SELECT DS1.col1 
FROM DS1 INNER JOIN DS2 
On DS1.COL3=DS2.COL3 

UNION

SELECT DS1.col1 
FROM DS1 INNER JOIN DS2 
ON DS1.COL4=DS2.COL2
...

答案 1 :(得分:3)

您加入的列中可能包含空值或空值。您的查询可能会将所有null / blank列匹配在一起,从而产生非常大的结果集。

我建议添加其他条款以排除空结果。

此外 - 如果两个表中都存在相同的行,那么您还应该阻止该行加入自身。

其中任何一个都可以有效地导致笛卡尔产品加入(或接近笛卡尔产品加入的东西)。

编辑:顺便说一句 - 调试此类问题的一种好方法是将两个数据集限制为一定数量的行 - 比如说每行100个 - 然后运行它并检查输出确保它是预期的。您可以使用SQL选项inobs=outobs=loops=执行此操作。 Here's a link to the documentation

答案 2 :(得分:0)

首先使用proc排序对要尝试合并的数据集进行排序。然后根据id合并数据集。

以下是如何做到这一点。  我假设你匹配字段为ID

proc sort data=DS1;
by ID;
proc sort data=DS2;
by ID;

data out;
merge DS1 DS2;
by ID;
run;

您可以对Ds3和DS4使用proc排序,然后在合并语句中包含它们,如果您还需要加入它们。