이번 게시글은 'PROC SQL 데이터 비교1' 게시글의 이어지는 글 입니다.
PROC SQL 구문의 가상 데이터와 자주 사용할 법한 예시를 알아보겠습니다.
활용 데이터는 이전 게시글에서 사용했던 employee_part1, employee_part2의 데이터로 동일한 사원 ID,사원 이름, 급여의 칼럼으로 구성되어 있습니다.
data employee_part1;
input empid name $ salary;
datalines;
101 Kim 5000
102 Lee 6000
103 Park 5500
104 Choi 4800
;
run;
data employee_part2;
input empid name $ salary;
datalines;
103 Park 5500
104 Choi 4800
105 Jung 5200
106 Kang 7000
107 Cho 4500
108 Yoon 6200
;
run;
■ EXISTS / NOT EXISTS : 데이터 존재여부 확인
proc sql;
select *
from employee_part1 a
where not exists (
select 1
from employee_part2 b
where a.empid = b.empid
);
quit;
위 코드는 PROC SQL에서 'Not Exists' 서브쿼리를 활용해서 employee_part2에는 없고, employee_part1에만 존재하는 데이터를 찾는 예제입니다.
select 1
from employee_part2 b
where a.empid = b.empid
위 코드는 서브쿼리로 employee_part2를 b라고 하며, a.empid = b.empid 두 테이블의 empid가 같은 행이 있는지 확인합니다.
select 1 은 실제 컬럼 값은 필요가 없지만 존재여부만 확인하기 위해 상수 1을 활용했습니다.
즉, employee_part1의 각 행에 대해 동일한 empid가 employee_part2에 존재하지 않는 경우만 조회하는 코드입니다.
■ EXISTS / NOT EXISTS
proc sql;
select *
from employee_part1
where empid in (
select empid
from employee_part2
);
quit;
위 코드는 두 테이블의 공통 empid (교집합) 데이터를 구하는 로직입니다.
PRCO SQL의 IN 서브쿼리를 활용해서 Employee_part2에도 존재하는 empid 데이터를 employee_part1의 행을 조회하는 코드입니다.
where empid in (
select empid
from employee_part2
);
WHERE + IN 서브쿼리는 왼쪽의 empid 서브쿼리 결과 값이 데이터 안에 포함되어 있으면 true 인 결과를 출력합니다.
INTERSECT 옵션도 공통된 값을 출력하지만, 전체 컬럼을 비교해야하지만, IN은 특정컬럼 empid 와 같은 한개의 컬럼만 가지고도 비교를 할 수 있기 때문에 비교적 실무에서 많이 사용됩니다.
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and save with the early bird rate—just $795!