2013-06-18 3 views
1

무결성 검사가 부족하여 기본 키 열에 여러 개의 중복 된 테이블이 있습니다. 그럴 수 있으니 중복 된 부분을 제거하려고합니다. 문제는, id 란이 없기 때문에 중복 된 것을 찾는 것이 중요하지 않다는 것을 의미합니다.행에서 행을 삭제 SAS의 B에서 일치하는 행

현재 해결책은 count(*)... having 구문을 사용하여 두 번째 테이블을 만들고 여기에 삭제할 행을 선택하는 것입니다. 다른 사람의 내용을 기반으로 하나 개의 테이블에서 삭제할 수있는 방법이

proc sql; 
delete from TableA 
where (v1,v2,v3) in TableB 

있습니까 : 내 문제는 SAS delete 명령은 다음을 허용하지 않는다는 것입니다? 다른 값 등

proc sql; 
delete from TableA as a 
where a.v1 = (select b.v1 from TableB as b where a.primaryKey = b.foreignKeyForTableA) 

과 :

답변

1

이보십시오. 그러나 TableB에서 중복 결과 (예 : 둘 이상의 결과)를 얻을 수 있기 때문에 "하나씩 선택"또는 "1 순위 선택"을 시도해 볼 수 있습니다.

1

당신은 상관 하위 쿼리와 함께이 작업을 수행 할 수 있습니다 만약 내가 제대로 이해하고

proc sql; 
delete from TableA 
    where exists (select 1 
        from TableB 
        where b.pk = TableA.v1 or b.pk = TableA.v2 or b.pk = TableA.v3 
       ) 
+1

코드에 여분의 괄호가 있습니다. 단지 확인하고 싶다고 생각합니다. – eykanal

+0

@eykanal. . . 예, 원래는 in 문으로 작성한 후 NULL이 문제를 일으킬 수 있음을 알았습니다. 나는 여분의 열린 p을 떠난 것 같았다. –

+0

안녕하세요 고든, 변경 사항을 확인해 주시겠습니까 와카, 그들은 첫눈에 괜찮아 보였다 ...하지만 난 아무 SQL 전문가 ... –

0

, 당신은 하나 명 이상의 관찰이 당신의 "키"변수의 같은 값을 (이 데이터 집합에서 모든 관찰을 제거하려면 모든 중복 제거).

SAS를 사용하여 가장 쉽고 쉬운 방법은 데이터 세트를 "키"변수로 정렬 한 다음 다른 데이터 단계를 사용하여 새 복사본을 만드는 것입니다. 열심히 설명하기보다는 설명하기 :

data have; 
    input x y z; 
    datalines4; 
1 2 3 
1 2 3 
2 3 4 
3 4 5 
3 4 6 
3 4 7 
4 5 6 
4 5 6 
;;;; 
run; 

proc sort data=have; 
    by x y z; 
run; 

data want; 
    set have; 
     by x y z; 
    if first.z and last.z; 
run; 

하위 설정 IF 문을 만든 자동 FIRST.LAST. 변수를 사용하는 경우에만 네 "독특한"관찰 유지 당신이 BY 문을 사용할 때.

proc sort nodupkey data=have out=want2; 
    by x y z; 
run; 

이 예에서 관찰이 제거됩니다, 키에 대해 고유 한 값으로 당신을 떠날 :

대신 경우에 당신은 당신이 PROC SORT으로 NODUPKEY 옵션을 사용할 수, 중복 중 하나를 유지하고 싶어 . 이 기술을 사용하여 관측치가 유지되는 을 제어 할 수 없습니다.

+0

'nodupkey'를 사용하는 아이디어가 마음에 들지만 어느 것이 유지되는지 통제 할 수 없다는 사실은이 접근 방식이 문제가되는 것입니다 . – eykanal

관련 문제