2014-03-12 5 views
1

둘 다 ID 열이있는 두 개의 테이블이 있습니다. 두 번째 테이블에 ID가있는 한 테이블의 행을 선택하고 싶습니다.SAS : ID가 다른 테이블에있는 행을 선택하십시오.

I 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 t1 where id (select id from t1)'는 옵티마이 저가 쿼리의 계획을보다 효율적으로 계획 할 수 있어야하며, 쿼리의 의도에 대해보다 명확하게 (imho) 명확합니다. –

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

이는 두 데이터 세트가 id' 순서 '에있는 경우 작업 (또는 적절한 인덱스가) 있습니다과 영업 이익이 원하는 것과 반대를하지 ... 그것은하지 * 한 세트에서 항목을 제외 * 다른 쪽 ... OP에서는 한 데이터 집합의 행을 원하지만 병합에서 겹쳐 쓰는 추가 열이나 값을 원하지 않을 수도 있습니다. –

1

이것은 존 클레멘트가 제시 한 수정과 홍콩 오오이의 방법에 대한 확장입니다. SQL을 사용하는 것보다 데이터 단계를 사용하는 것이 더 빠름을 발견했습니다. 또한 데이터를 출력하는 데 더 많은 옵션을 제공합니다. 예를 들어,이 솔루션은 table1에 table2에없는 모든 ID를 보유하는 "match_error"라는 테이블을 작성합니다.

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; 
관련 문제