Lateral 조인 사용

Lateral 조인 사용 (Using lateral joins)

이 문서는 Snowflake에서 lateral 조인(lateral join)을 사용하는 방법을 예시와 함께 설명해요.

출처: Using lateral joins

본문

개요

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의 성능은 참조하는 테이블과 함수의 구조에 따라 달라질 수 있어요.

더 알아보기 (Learn more)