이미지 출처: https://theartofpostgresql.com/blog/2019-09-sql-joins/
공통 필드(특정 KEY)
를 가지고 MERGE
할 때 사용된다.분산되어 있는 정보를 통합
하는데 사용한다.SELECT A.*
, B.*
FROM TABLE1 A
_ JOIN TABLE2 B -- JOIN 앞의 _에 LEFT, INNER, RIGHT, CROSS, FULL이 들어가게 된다
ON A.KEY1 = B.KEY1
AND A.KEY2 = B.KEY2;
먼저 중복 레코드가 없고 Primary Key의 uniqueness가 보장되어야 한다. (JOIN을 하기에 앞서 항상 데이터의 정확성을 검증해야 한다.)
조인하는 테이블들간의 관계를 명확하게 정의해야 한다.
완전한 ONE TO ONE
과 한쪽이 부분 집합이 되는 ONE TO ONE
이 존재한다.EMPLOYEE
테이블과 DEPARTMENT
테이블이 있다고 했을 때 DEPARTMENT
관점에서 하나의 지점에 여러 직원이 속할 수 있으므로 둘은 ONE TO MANY
관계이다.어떤 테이블을 베이스로 잡을지(FROM에 사용할지) 결정해야 함.
💻 이 포스트에서는 이 두 테이블을 이용해 JOIN에 대해 정리하였다.
raw_data.Vital
은 환자의 Vital 측정 정보를 담고 있는 테이블이다.raw_data.Alert
은 환자의 Alert 정보를 담고 있는 테이블로 Vital과 관련하여 변화가 발생하였다면 Alert 테이블에 정보가 쌓이게 된다.SELECT *
FROM RAW_DATA.VITAL V
JOIN RAW_DATA.ALERT A
ON V.VITALID = A.VITALID;
SELECT *
FROM RAW_DATA.VITAL V
LEFT JOIN RAW_DATA.ALERT A
ON V.VITALID = A.VITALID;
NULL
이 NONE
으로 나오게 된다.LEFT JOIN
과 방향만 바뀐 개념으로 만약 왼쪽 테이블의 데이터 중 오른쪽 레코드와 매칭되는 경우가 있다면 오른쪽 레코드와 매칭되는 경우만 채워진 상태로 리턴된다.SELECT *
FROM RAW_DATA.VITAL V
RIGHT JOIN RAW_DATA.ALERT A
ON V.VITALID = A.VITALID;
SELECT *
FROM raw_data.Vital V
FULL JOIN raw_data.Alert A
ON V.VITALID = A.VITALID
4 * 3 = 12
개의 데이터가 조합돼서 나온다.CROSS JOIN
은 JOIN한 테이블 데이터 사이에서 나올 수 있는 모든 경우의 수를 조합해 주기 때문에 ON 절
을 통해 KEY
를 매칭해 줄 필요가 없다.SELECT *
FROM RAW_DATA.VITAL V
CROSS JOIN RAW_DATA.ALERT A;
SELECT *
FROM raw_data.Vital V1
JOIN raw_data.Vital V2
ON V1.VITALID = V2.VITALID