Lateral 조인 사용
Lateral 조인 사용 (Using lateral joins)
이 문서는 Snowflake에서 lateral 조인(lateral join)을 사용하는 방법을 예시와 함께 설명해요.
본문
개요
lateral join은 FROM 절에서 테이블 함수를 사용할 때, 함수가 앞선 테이블의 각 행을 참조할 수 있게 해주는 조인 방식이에요. 일반적으로 서브쿼리나 테이블 함수와 함께 사용돼요.
SQL에서 LATERAL은 FROM 절에 오는 상관(correlated) 서브쿼리나 테이블 함수 앞에 지정해요. lateral join은 다음 구조를 가져요:
SELECT ...
FROM table1, LATERAL( <subquery 또는 table function> ) AS alias
여기서 subquery는 왼쪽의 table1의 각 행을 참조할 수 있어요.
예제 1: FLATTEN과 함께 사용
Snowflake의 FLATTEN 테이블 함수는 반정형 데이터를 개별 행으로 펼칩니다. lateral join은 FLATTEN을 사용할 때 특히 유용해요.
예를 들어 각 사용자의 선호 태그 배열을 가진 테이블:
CREATE TABLE users (
user_id INT,
tags VARIANT
);
INSERT INTO users VALUES
(1, ['snow', 'ski']),
(2, ['hike', 'camp']),
(3, ['run']);
lateral join으로 각 태그를 개별 행으로 펼치려면:
SELECT u.user_id, tag.value::VARCHAR AS tag
FROM users u,
LATERAL FLATTEN(input => u.tags) tag;
이 쿼리는 다음을 반환해요:
+---------+-------+
| USER_ID | TAG |
+---------+-------+
| 1 | snow |
| 1 | ski |
| 2 | hike |
| 2 | camp |
| 3 | run |
+---------+-------+
여기서 u.tags는 왼쪽 테이블 users의 각 행을 참조하는 방식으로 평가돼요. 이것이 lateral join의 핵심이에요.
예제 2: 서브쿼리와 함께 사용
lateral 조인은 FROM 절의 상관 서브쿼리에서도 사용할 수 있어요. 예를 들어 각 부서에서 최고 연봉을 가진 직원을 찾는 쿼리:
CREATE TABLE employees (
dept VARCHAR,
name VARCHAR,
salary NUMBER
);
각 부서에서 가장 높은 연봉을 가진 직원을 찾으려면:
SELECT e.dept, e.name, e.salary
FROM departments d,
LATERAL (
SELECT name, salary, dept
FROM employees e
WHERE e.dept = d.dept
ORDER BY salary DESC
LIMIT 1
) e;
여기서 lateral 서브쿼리는 바깥쪽 departments 테이블 d의 각 행을 참조해, 그 부서의 최고 연봉 직원을 반환해요.
lateral join 없이 같은 결과 얻기
lateral join을 사용할 수 없거나 피하고 싶다면, JOIN의 ON 절이나 서브쿼리로 같은 결과를 얻을 수 있어요. 하지만 lateral join은 특히 FLATTEN 같은 테이블 함수에서 더 간결하고 읽기 쉬운 구문을 제공해요.
주의 사항
- lateral join은 SQL 표준(ISO/IEC 9075)의 일부이며, Snowflake의 코어 SQL 구문이에요.
- FROM 절의 테이블 함수에는 LATERAL 키워드 없이도 자동으로 lateral 방식이 적용되는 경우가 있어요(snowflake는 LATERAL을 명시하지 않아도 관련 동작을 수행함).
- lateral join의 성능은 참조하는 테이블과 함수의 구조에 따라 달라질 수 있어요.