Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- Oracle
- 암호화
- was
- web.xml
- 과정평가형
- jsp
- javascript
- TO_DATE
- CSS
- eGov
- 정의
- mybatis
- jQuery
- Ajax
- sql
- 오류
- POI
- 함수
- json
- array
- html
- select
- 개념
- JVM
- spring
- 태그
- Java
- controller
- input
- eGovFramework
Archives
- Today
- Total
web developer
[PostgreSQL] CROSS JOIN LATERAL 본문
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 |