我对下面的代码感到困惑,但它确实运行并使用acct_nb和CashAmount返回输出。如果b.acct_nb为null,我们如何进行左连接a.acct_nb = b.acct_nb?为什么输入数据NewData具有acct_nb帐户,而不是所有空帐户保留。这不是我的代码,我无法理解它在做什么。
proc sql;
create table NewData as select
a.acct_nb, a.CashAmount
from dataA as a left join dataB as b
on a.acct_nb=b.acct_nb
where b.acct_nb is null order by acct_nb;
quit;
答案 0 :(得分:3)
关键是这是LEFT JOIN。这意味着表A中的所有行以及与B匹配的任何行。
之后,它应用WHERE条件b.acct_nb is null
。
因此有两种情况b.acct_nb is null
。
这是一个简单的例子:
data dataA;
input acct_nb cashamount;
datalines;
1 1
2 3
. 4
5 .
;
data dataB;
input acct_nb;
datalines;
1
.
5
;
proc sql;
select
a.acct_nb, a.CashAmount
from dataA as a left join dataB as b
on a.acct_nb=b.acct_nb
where b.acct_nb is null
order by acct_nb;
quit;
返回
acct_nb cashamount
ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ
. 4
2 3
第一条记录是因为缺少a.acct_nb并与b中的记录匹配。
第二条记录是因为数据B中不存在acct_nb = 2。
如果acct_nb永远不为null,那么这是一种在dataA中查找不在dataB中的记录的方法。