[개발 일기] 2025.03.15 - LATERAL JOIN

2025. 3. 15. 20:42·개발 일기

💡 개요

오늘은 MySQL과 같은 SQL 기반 데이터베이스에서 사용되는 쿼리인 LATERAL JOIN에 대해 정리해보자.

 

 

 

📕 LATERAL JOIN

 

LATERAL JOIN이란 서브 쿼리 내부에서 외부의 컬럼을 참조하고자 할 때 사용하는 방법이다.

 

 

역시나 말로는 설명이 어렵다.

 

 

다음은 각 사용자가 작성한 게시글 중, 가장 최근에 작성된 게시글을 조회하는 쿼리 예시이다.

 

 

 

회원 테이블

 

id 회원 이름
1 홍길동
2 이형석

 

 

 

게시판 테이블

 

id member_id board_title board_content
1 1 길동이의 일기 …
2 1 길동이 플레이리스트 …
3 2 형석이의 성장일기 …

 

 

 

LATERAL JOIN 을 사용하지 않은 쿼리

 

SELECT 
    m.id AS member_id,
    m.name AS member_name,
    b.id AS post_id,
    b.board_title,
    b.board_content
FROM members m
JOIN boards b ON m.id = b.member_id
WHERE b.id = (
    SELECT MAX(id)
    FROM boards
    WHERE member_id = m.id
);

 

 

 

LATERAL JOIN을 사용한 쿼리

 

SELECT 
    m.id AS member_id,
    m.name AS member_name,
    p.id AS post_id,
    p.board_title,
    p.board_content
FROM members m
LEFT JOIN LATERAL (
    SELECT 
        b.id,
        b.board_title,
        b.board_content
    FROM boards b
    WHERE b.member_id = m.id
    ORDER BY b.id DESC
    LIMIT 1
) p ON TRUE;

 

 

LATERAL JOIN 의 특징은 LEFT JOIN LATERAL <테이블> 서브 쿼리 내부(boards b)에서 서브 쿼리 외부(members m)의 m.id 를 의존할 수 있다.

 

 

어떻게 본다면 LATERAL JOIN 을 사용한 쿼리가 더 복잡해보이기도 한다.

 

 

하지만 현재 테이블 상태보다 훨씬 더 복잡하고 많은 데이터를 다뤄야 하는 JOIN의 경우라면 LATERAL JOIN을 사용하면 서브쿼리와 JOIN을 결합하여 복잡한 로직을 단순화할 수 있다. (서브 쿼리 내부에서 외부에 있는 컬럼 의존 가능)

 

 

또한 LATERAL JOIN은 각 회원에 대해 동적으로 데이터를 추출하기 때문에 쿼리의 효율성이 좋아질 수 있다.

 

 

왜냐하면 LEFT JOIN LATERAL <테이블>의 경우 서브쿼리에서 조건에 맞는 결과만 가져오기 때문에, 테이블에서 조인할 데이터의 양이 줄어들기 때문이다.

 

 

👨🏻‍💻 참고

[MySQL] 1:N 조인에서 드리븐 테이블 레코드를 최신 k개(order by desc, limit k)씩 제한을 두어 조회하려면 어떻게 해야할까요? | OKKY Q&A

'개발 일기' 카테고리의 다른 글

[개발 일기] 2025.03.17 - Code Kata  (0) 2025.03.17
[개발 일기] 2025.03.16 - Session.invalidate()  (0) 2025.03.16
[개발 일기] 2025.03.14 - 인메모리는 휘발성이라매  (0) 2025.03.14
[개발 일기] 2025.03.13 - @BeforeAll  (0) 2025.03.13
[개발 일기] 2025.03.12 - filter에서 발생하는 예외  (0) 2025.03.12
'개발 일기' 카테고리의 다른 글
  • [개발 일기] 2025.03.17 - Code Kata
  • [개발 일기] 2025.03.16 - Session.invalidate()
  • [개발 일기] 2025.03.14 - 인메모리는 휘발성이라매
  • [개발 일기] 2025.03.13 - @BeforeAll
오도형석
오도형석
  • 오도형석
    형석이의 성장일기
    오도형석
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • MSA 모니터링 서비스
        • DB
      • 스파르타 코딩클럽
        • SQL
        • Spring
      • 백엔드
        • Internet
        • Java
        • DB
      • 캡스톤
        • Django
        • 자연어처리
      • Spring
        • JPA
        • MSA
      • ETC
        • ERROR
      • 개발 일기 N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • 태그

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
오도형석
[개발 일기] 2025.03.15 - LATERAL JOIN
상단으로

티스토리툴바