Chapter 3. Combining Tables Horizontally Using PROC SQL - (1)

아래 그림처럼 여러개의 데이터테이블을 가져와서 양 옆으로 합쳐 새로운 데이터테이블을 만드는게 JOIN이라고 합니다. 이렇게 합칠때 어떤 값을 매치해서 합쳐야할지 조건이 들어가야겠죠. 이렇게 합칠때 꼭 Table A와 Table B가 같은 갯수의 행이 있어야하는건 아닙니다. 서로 행의 갯수가 다를수도 있어요. 




이렇게 데이터테이블을 JOIN할때 어떻게 합칠것인지 정해야하는데요. 유형이 크게 두가지가 있습니다. 

첫번째는 INNER JOIN이라고, 테이블끼리 서로 매치되는 (같은 값을 가지는) 것만 행을 합치는 방법. 

두번째는 OUTER JOIN이라고 첫번째와 거기에 서로 매치되지 않는 것까지 다 합칠때를 말합니다. 




둘 중 어느 방법을 사용하더라도 Cartesian Product(곱집합)가 계산되어 테이블끼리 어떻게 합칠 수 있는지 경우의 수가 계산되는데요. Cartesian product가 뭔지 살펴보도록 하죠. 


Cartesian product

아래 그림처럼 One, Two 두 테이블이 있다고 합시다. 이때 proc sql에서 select * 했을때 나오는 결과값이 그 아래 그림과 같은데요. 아래 코드처럼 FROM구문에서 불러올 데이터를 선택하지만 WHERE구문의 조건을 걸어두지 않을때 아웃풋은 Cartesian product방법을 통해 결과 데이터테이블이 만들어집니다. 


즉, One 데이터 테이블의 각 행(row)이 Two 데이터테이블의 각 행마다 데이타가 결합되어서 모든 조합의 행들이 다 계산되어져서 나오는거죠. 그래서 One, Two데이타는 각각 3개의 행으로 되어있지만 결과값은 3^2=9 9개의 행이 만들어져서 나오게 됩니다. 또 한가지. One, Two 각각 X라는 이름의 열(column)이 있죠. 이렇게 열 이름이 같더라도 결과값이 합쳐지는게 아니라 다 나오게 됩니다. 




데이터 테이블에서 행의 갯수가 적을때 괜찮지만 만약 One, Two데이타의 행의 갯수가 1000개라고 하면 1000^2 = 1,000,000행이 만들어지겠죠. 이럴땐 SAS Log 파일창에 이런 메시지가 뜨게 됩니다.  

NOTE: The execution of this query involves performing one or
more Cartesian product joins that cannot be optimized.



그럼 다음 포스팅에서 Inner Joins에 대해 자세히 다뤄보도록 하겠습니다. 


# SAS 자격증, SAS advanced, SAS advanced programming, SAS PREP GUIDE, 자격증 

반응형

+ Recent posts