两个数据集
一:
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;
这相当于原始代码吗?
答案 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变量,它计算秒数,而不是几天。