쿼리 속도를 최적화 하다보니 LATERAL JOIN 을 처음으로 학습하게 되었다.
기존에도 이 쿼리를 본적은 많은데 내가 이해하지를 못했다.
이 구문은 left join 을 이용해서 subquery 를 만들 때 외부 query의 column 값을 이용할 수 있다는 것이다.
* customers 테이블 : 이용고객
- id, name
* products 테이블 : 판매상품
- id, product_name, price
* orders 테이블 : 주문내역
- id, customer_id, product_id, order_date
이런 테이블이 있을 때 "고객별 '가장 비싼 최신 주문' 가져오기" 쿼리를 만들면
SELECT
c.name AS customer_name,
latest_order.product_name,
latest_order.price,
latest_order.order_date
FROM customers c
LEFT JOIN LATERAL (
-- 각 고객(c.id)에 대해 실행되는 서브쿼리
SELECT
p.product_name,
p.price,
o.order_date
FROM orders o
JOIN products p ON o.product_id = p.id
WHERE o.customer_id = c.id -- 외부 테이블 c의 id를 참조
ORDER BY o.order_date DESC, p.price DESC
LIMIT 1 -- 딱 1건만 가져옴
) latest_order ON TRUE; -- LEFT JOIN이므로 조건은 항상 TRUE로 설정
라는 쿼리를 만들 수 있다.
이렇게 하면 전체데이터를 뒤지지 않아서 속도가 빨랐다.
몰랐는데 from 이나 join 에 들어가는 subquery 의 경우 독립된 테이블로 취급한다고 한다. 그래서 이 경우 "lateral join" 을 사용하지 않으면 참조가 불가능 하다고 한다.
subquery 에도 여러종류가 있는 것 같다. 다음에는 이것을 공부해야겠다.