2012-01-20 24 views
5

我正在嘗試在一個任務中執行此操作,否則我只會使用數據步驟。如何使用Proc SQL查找只存在於一個表中但不存在於另一個表中的所有記錄?

在數據的步驟,這將是:

data names; 
input name $; 
datalines; 
    John 
    Mary 
    Sally 
    Fred 
    Paul 
; 
run; 

data check; 
input name $; 
datalines; 
    Mary 
    Fred 
; 

Proc sort data=names; by name; run; 
Proc sort data=check; by name; run; 

Data work.not_in_check; 
merge names(in=n) check(in=c); 
by name; 
if n and not c; 
run; 

回答

9

這裏有一種方法。當然還有其他許多人。

proc sql; 
create table not_in_check as 
select name 
from names 
where name not in (select name from check); 
quit; 
+1

這比數據步驟顯然更優雅,如果你問我... –

7

另一個細微變化是:

proc sql; 
create table not_in_check as select 
a.* from names as a left join 
      check as b on 
      a.name=b.name 
      where b.name is null; 
quit; 
+0

這是我最終在EG中使用的方法。在「篩選數據」部分中,我使用的b.name丟失。很高興看到一個關於爲什麼當我希望a.name不在b中出現的解釋,b.name是null(缺失)使得這種情況發生...... –

+1

這是因爲正在讀入2列,a。名字和b.name。然後這些匹配,因此如果一個名稱存在但不是b,則b.name記錄將會丟失。與null的左連接where子句可確保您只將名稱保留在a而不是b中。 select a。*確保它僅從表a中輸出數據,即使它正在從兩個表中讀取數據。希望這可以幫助。 – Longfish

+0

很好的解釋...謝謝 –

0
proc sql; 
create table inNamesNotIncheck 
as 
select * 
from names n 
where not exists 
(select name 
from check c 
where n.name=c.name); 
quit; 
+0

嗨,你的帖子被標記爲「低質量」,可能是因爲它只包含代碼。你可以通過提供解釋這個問題的答案和原因的解釋來大幅提高你的答案。 – Ben

+0

我欣賞代碼的添加。它顯示了對已經描述的問題的不同但可行的方法。謝謝。 –

1

下面的方法是很簡單的方式來獲得出現在一個表中,而不是在其他記錄。

創建新表包含性別= M,查詢後的結果將記錄與性別記錄= F.

例子:

data new; 
set sashelp.class; 
where sex = 'M'; 
run; 
proc sql; 
create table new1 as 
select * from sashelp.class 
except all 
select * from new; 
quit; 

將會把代碼來測試我的實際數據集其中大約100k obs並更新結果。

P.S:我知道這個問題已被問及已被回答和遺忘,我正在尋找一種方法來做到上述,並找不到直接的答案。所以,添加它可能會得心應手。 :)

我的第一個答案也。 :)

相關問題