카테고리:

쿼리 구문

LATERAL

FROM 절에서 LATERAL 키워드를 사용하면 인라인 뷰가 해당 인라인 뷰에 선행하는 테이블 식의 열을 참조할 수 있습니다.

래터럴 조인은 대부분의 조인보다 상관 하위 쿼리처럼 작동합니다. 래터럴 조인은 서버가 다음과 유사한 루프를 실행한 것처럼 작동합니다.

for each row in left_hand_table LHT:
    execute right_hand_subquery RHS using the values from the current row in the LHT
Copy

래터럴이 아닌 조인의 출력과 달리, 래터럴 조인의 출력에는 인라인 뷰에서 생성된 행만 포함됩니다. 왼쪽의 행은 오른쪽과 조인될 필요가 없습니다. 왼쪽의 행은 인라인 뷰로 전달되어 이미 고려되었기 때문입니다.

참고 항목: 측면 조인 사용하기.

이 항목의 내용:

구문

SELECT ...
FROM <left_hand_table_expression>, LATERAL ( <inline_view> )
...
Copy

매개 변수

left_hand_table_expression

이는 다음과 같은 행 소스입니다.

  • 테이블.

  • 뷰.

  • 하위 쿼리.

  • 테이블 함수.

  • 이전 조인의 결과입니다.

inline_view

inline_view 는 다음과 같을 수 있습니다:

  • 인라인 뷰: 문 내에서 정의되고 문의 기간 동안에만 유효한 뷰.

  • 하위 쿼리.

  • 테이블 함수: FLATTEN 과 같은 기본 제공 테이블 함수 또는 사용자 정의 테이블 함수(UDTF).

inline_view 는 테이블이 될 수 없습니다.

사용법 노트

  • LATERAL 키워드 뒤의 인라인 뷰는 인라인 뷰 자체에서만, 그리고 FROM 절의 인라인 뷰 왼쪽에 있는 테이블에서만 열을 참조할 수 있습니다.

    SELECT *
      FROM table_reference_me, LATERAL (...), table_do_not_reference_me ...
    
    Copy
  • 일반적으로 인라인 뷰는 left_hand_table_expression 의 열을 참조하지만, 반드시 그렇게 할 필요는 없습니다.

  • INNER JOIN 구문이 쉼표나 INNER JOIN이라는 키워드를 사용할 수 있는 것처럼 래터럴 조인도 쉼표나 INNER JOIN이라는 키워드를 사용할 수 있습니다. 예:

    FROM departments AS d INNER JOIN LATERAL (...)
    
    Copy
  • 측면 테이블 함수(SQL UDTF 제외)에는 ON, USING 또는 NATURAL JOIN 절을 지정할 수 없으며 테이블 함수(SQL UDTF 제외)에 대한 외부 측면 조인에는 ON, USING 또는 NATURAL JOIN 절을 지정할 수 없습니다.

    자세한 내용은 항목의 JOIN 사용법 노트 를 참조하십시오.

참고 항목: 예: FLATTEN 테이블 함수와 함께 래터럴 조인 사용FLATTEN을 사용하여 WHERE 절에서 결과 필터링하기.

다음 예제에서는 이러한 테이블을 사용합니다.

CREATE TABLE departments (department_id INTEGER, name VARCHAR);
CREATE TABLE employees (employee_ID INTEGER, last_name VARCHAR,
  department_ID INTEGER, project_names ARRAY);

INSERT INTO departments (department_ID, name) VALUES
  (1, 'Engineering'),
  (2, 'Support');
INSERT INTO employees (employee_ID, last_name, department_ID) VALUES
  (101, 'Richards', 1),
  (102, 'Paulson',  1),
  (103, 'Johnson',  2);
Copy

다음 쿼리는 하위 쿼리가 있는 측면 조인입니다.

SELECT *
  FROM departments AS d,
    LATERAL (SELECT * FROM employees AS e WHERE e.department_ID = d.department_ID) AS iv2
  ORDER BY employee_ID;
Copy
+---------------+-------------+-------------+-----------+---------------+---------------+
| DEPARTMENT_ID | NAME        | EMPLOYEE_ID | LAST_NAME | DEPARTMENT_ID | PROJECT_NAMES |
|---------------+-------------+-------------+-----------+---------------+---------------|
|             1 | Engineering |         101 | Richards  |             1 | NULL          |
|             1 | Engineering |         102 | Paulson   |             1 | NULL          |
|             2 | Support     |         103 | Johnson   |             2 | NULL          |
+---------------+-------------+-------------+-----------+---------------+---------------+

다음 SQL 문은 동등하며 동일한 출력을 생성합니다. FROM 절의 쉼표 대신 INNER JOIN 키워드를 사용합니다.

SELECT *
  FROM departments AS d INNER JOIN
    LATERAL (SELECT * FROM employees AS e WHERE e.department_ID = d.department_ID) AS iv2
  ORDER BY employee_ID;
Copy