web developer

[PostgreSQL] CROSS JOIN LATERAL 본문

SQL

[PostgreSQL] CROSS JOIN LATERAL

trueman 2025. 3. 13. 21:22
728x90
728x90

CROSS JOIN LATERAL


PostgreSQL에서 CROSS JOIN LATERAL이 있습니다.


LATERAL은 영어 발음으로 "래터럴"
뜻: "측면의", "옆으로"라는 의미가 있어서, SQL에서 각 행(왼쪽)별로 서브쿼리를 실행하는 느낌이랑 잘 맞음!


  LATERAL이란?

  • LATERAL은 서브쿼리가 왼쪽 테이블의 각 행을 참조할 수 있도록 해줍니다.
  • 보통 JOIN LATERAL 또는 CROSS JOIN LATERAL과 함께 사용됩니다.
  • 각 행별로 동적 서브쿼리를 실행해야 할 때
  • 다른 테이블과 결합하면서 조건이 복잡할 때
  • 하위 쿼리에서 LIMIT을 써야 할 때

JOIN vs LEFT JOIN vs CROSS JOIN LATERAL 차이

비교 항목 JOIN (INNER JOIN) LEFT JOIN CROSS JOIN LATERAL
조인 방식 공통된 키 값이 있는 행만 가져옴 왼쪽 테이블의 모든 행을 포함하고, 오른쪽에 없으면 NULL 왼쪽 테이블의 각 행마다 개별 서브쿼리 실행
NULL 포함 여부 매칭이 없으면 제외됨 매칭이 없으면 NULL 포함 한쪽 테이블의 모든 데이터를 유지할 때
사용 목적 두 테이블의 교집합을 가져올 때 한쪽 테이블의 모든 데이터를 유지할 때 각 행마다 동적인 서브쿼리 실행이 필요할 때
성능 차이 가장 일반적이고 빠름 INNER JOIN보다 조금 느릴 수 있음 각 행마다 서브쿼리를 실행해야 해서 비효율적일 수도 있음

 


✅ 1. JOIN (또는 INNER JOIN)

양쪽 테이블에서 매칭되는 데이터만 가져옴

SELECT c.customer_id, c.name, o.order_id, o.order_date
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id;

 

📌 결과:

  • 고객이 주문을 한 경우만 출력됨.
  • 주문이 없는 고객은 제외됨.

 

✅ 2. LEFT JOIN

각 고객의 모든 주문을 가져오는 경우

SELECT c.customer_id, c.name, o.order_id, o.order_date
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id;

 

📌 결과:

  • 고객이 주문이 없으면 NULL이 들어감.
  • 한 고객이 여러 개의 주문을 하면 중복 행이 생성됨.

 

✅ 3. CROSS JOIN LATERAL

각 고객별로 가장 최근 주문 1개만 가져오기

🔥 즉, LATERAL을 쓰면 for문 돌리는 느낌으로 각 행마다 다른 서브쿼리 결과를 가져올 수 있음! 🔥

SELECT c.customer_id, c.name, o.order_id, o.order_date
FROM customers c
CROSS JOIN LATERAL (
    SELECT order_id, order_date
    FROM orders o
    WHERE o.customer_id = c.customer_id
    ORDER BY order_date DESC
    LIMIT 1
) o;

 

📌 결과:

  • 각 고객별로 최신 주문 1개만 가져옴.
  • JOIN과 LEFT JOIN으로는 개별 행마다 LIMIT 1 적용이 어려움.
  • 서브쿼리를 각 행마다 실행해야 해서 동적 조인에 강함.

- customers 테이블: 고객 정보 (customer_id, name)
- orders 테이블: 주문 정보 (order_id, customer_id, order_date)


 

728x90
728x90

'SQL' 카테고리의 다른 글

[sql] LAG, LEAD 함수  (1) 2023.08.22
[sql] GROUP BY  (0) 2023.08.20
[sql] sql, database, dbms, schema 개념 이해하기  (0) 2022.12.10