SAS,条件为null

时间:2016-04-20 13:20:33

标签: sas where-clause

我对下面的代码感到困惑,但它确实运行并使用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;

1 个答案:

答案 0 :(得分:3)

关键是这是LEFT JOIN。这意味着表A中的所有行以及与B匹配的任何行。

http://support.sas.com/documentation/cdl/en/sqlproc/69049/HTML/default/viewer.htm#p0o4a5ac71mcchn1kc1zhxdnm139.htm

之后,它应用WHERE条件b.acct_nb is null

因此有两种情况b.acct_nb is null

  1. 如果dataB在acct_nb中有一个空值的记录。
  2. 如果dataA中的acct_nb在dataB中没有相应的记录。
  3. 这是一个简单的例子:

    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中的记录的方法。