2014-03-12 54 views
1

我有兩個表,它們都有一個ID列。我想選擇一個表中具有第二個表中的ID的行。SAS:選擇ID在另一個表中的行

我R我會這麼說tbl1 [tbl $ ID%in%tbl2 $ ID,],但我還沒有找到一種方法將其轉換爲SAS。

回答

1

試試這個:

PROC SQL; 
CREATE TABLE result AS 
SELECT t2.* 
FROM table1 AS t1, table2 AS t2 
WHERE t1.id = t2.id 
; 
QUIT; 
+3

我只會注意到避免連接可能更高效,因爲它僅用於此處的成員測試的副作用,而不是其主要任務。 'select * from t2 where id in(select select from t1)'應該允許優化器更有效地計劃查詢,並且對於查詢的意圖更加清楚(imho)。 –

-1
data out; 
    merge table1 (in=t1) table2 (in=t2); 
    by id; 
    if t1 and not t2; 
run; 
+1

這隻有在兩個數據集都是'id'順序(或者有合適的索引)並且與OP想要的相反時纔會起作用......它排除了一組* *在另一箇中...... OP還聲明他們需要來自一個數據集的行,他們可能不希望從合併中覆蓋其他列或值。 –

1

這是香港大井的方法與喬恩克萊門特提出更正的擴展。我發現使用數據步驟比使用SQL更快。它爲您提供更多的數據輸出選項。例如,此解決方案創建一個名爲「match_error」的表,該表包含table1中不在table2中的所有ID。

proc sort data=table1; 
    by id; 
run; 

proc sort data=table2; 
    by id; 
run; 

data result match_error; 
    merge table1 (in=in_T1) table2 (in=in_T2 keep=id); 
    by id; 
    if in_T1 and in_T2 then output result; 
    if in_T1 and not in_T2 then output match_error; 
run; 
相關問題