proc sql join on子句不起作用

时间:2015-07-06 09:41:17

标签: sas

两个数据集

一:

Date, A

二:

StartDate, EndDate, B

(所有日期变量均采用日期格式)

以下逻辑非常明确:在单个键上连接两个表,具有日期范围条件。

proc sql;
select a.*, b.*
from One as a left join Two as b
on a.A = b.B
where a.Date between b.StartDate and b.EndDate;

但是,如果我将a.Date between b.StartDate and b.EndDate移动到on子句,它可以正常工作(不确定它是否产生相同的输出)。

proc sql;
select a.*, b.*
from One as a left join Two as b
on a.A = b.B and a.Date between b.StartDate and b.EndDate;

这相当于原始代码吗?

2 个答案:

答案 0 :(得分:3)

2个查询不同。第一个将首先执行左连接,即保留数据集One中的行数,在A和B匹配的位置添加值。然后where子句只保留符合Date条件的行,因此最终可能会比在One中的行少。

第二个查询只会连接两个A和B匹配的行,而Date条件也是如此。这次结果应包含与数据集One相同的行数,因为没有where子句。

答案 1 :(得分:0)

WHERE子句中有错误。 对a.Date的引用应该是DATEPART(a.Date),因为a.Date是一个DATETIME变量,它计算秒数,而不是几天。