2016-04-20 7 views
1

Я смущен приведенным ниже кодом, однако он запускает и возвращает выходные данные с помощью acct_nb и CashAmount. Если b.acct_nb имеет значение null, как мы можем сделать левое соединение a.acct_nb = b.acct_nb? Почему вместо остальной нулевой учетной записи выходные данные NewData имеют учетные записи с acct_nb. Это не мой код, и я не понимаю, что он делает.SAS, где условие равно null

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

Я тоже смущен. Почему вы присоединяете таблицу b к таблице a, если вы не используете ни одну из переменных в таблице b в вашей результирующей таблице? – superfluous

+1

Это на самом деле аккуратный трюк, о котором я никогда не думал - способ найти записи в A, которые не представлены в B. См. Мой ответ ниже. – DomPazz

+0

Это просто, спасибо! – superfluous

ответ

3

Ключ в том, что это ЛЕВЫЙ ВСТУПЛЕНИЕ. Это означает, что все строки из таблицы А, и любые строки, которые соответствуют из В.

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

После этого, он применяется, когда условие b.acct_nb is null.

Таким образом, существует 2 случая, когда b.acct_nb is null.

  1. Если dataB имеет запись с нулевым значением в acct_nb.
  2. Если acct_nb в dataA не имеет соответствующей записи в dataB.

Вот простой пример:

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 отсутствует и совпадает с записью в б.

Вторая запись есть, потому что acct_nb = 2 не существует в dataB.

Если acct_nb никогда не является нулевым, то это способ найти записи в dataA, которые НЕ находятся в dataB.

+0

Благодарим вас за время, отвечая на этот вопрос, DomPAzz. Вы отвечаете очень ясно. Еще раз спасибо. – user1481397

+0

рады помочь. Примите этот ответ, если он полностью ответит на ваш вопрос. – DomPazz

Смежные вопросы