본문 바로가기
프로그래밍/SQL, Hive, SAS 관련 정보

[SQL 기초] Self 조인

by TrillionNT 2025. 3. 17.

2025.02.24 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL] Table of Contents


셀프 조인(Self Join)은 어떤 테이블을 자기 자신과 조인하는 방법입니다. 테이블 내에서 행 간의 관계를 분석하거나 비교할 때 유용하게 사용할 수 있습니다. 셀프 조인을 사용하는 대표적인 예를 한 번 살펴보겠습니다. 

 

1. Hierarchical Data : 

예를 들어서 테이블이 하나 있는데 여기에 Employee와 Manager가 모두 한꺼번에 들어있다고 해보겠습니다. 여기서 employer와 그 manager 관계를 조회하고 싶을 때 Self Join을 활용하면 됩니다. 

ChatGPT의 도움을 받아서 그려봤습니다.

SELECT
    e.id,
    e.first_name,
    e.last_name,
    e.salary,
    m.first_name AS boss_first_name,
    m.last_name AS boss_last_name
FROM employee AS e
INNER JOIN employee AS m
    ON e.manager_id = m.id;

 

 

 

2. Sequential Data

말 그대로 정보에 순차성이 존재하는데 각 단계의 다음 정보를 보여주려 한다면 Self Join을 해주어야겠죠. 

SELECT
    i1.id AS step_id,
    i1.content AS step_content,
    i2.id AS next_step_id,
    i2.content AS next_step_content
FROM instruction i1
LEFT JOIN instruction i2 ON i1.next_id = i2.id;

 

 

3. Graphs (Multiple relationships within the same Table)

Network Analysis에서 많이 등장하는 상황일 겁니다. 테이블 안의 항목끼리 다중관계를 이루고 있는 경우입니다. 

SELECT
    start.name AS start_city,
    destination.name AS destination_city
FROM city AS start
INNER JOIN route AS r ON start.id = r.from_city_id
INNER JOIN city AS destination ON destination.id = r.to_city_id;

 

 

참고) https://learnsql.com/blog/illustrated-guide-sql-self-join/

 


이를 응용해서 적용해 볼 수도 있겠죠. 만약 장바구니에서 두 상품을 동시에 담은 장바구니의 수를 조회하는 쿼리를 작성한다면 아래와 같은 방법을 생각해 볼 수 있습니다. 

WITH DistinctCartProducts AS (
    SELECT DISTINCT CART_ID, NAME  -- 1. 장바구니별 중복 제거
    FROM CART_PRODUCTS
)
SELECT 
    a.NAME AS X,
    b.NAME AS Y,
    COUNT(DISTINCT a.CART_ID) AS COUNT
FROM DistinctCartProducts a
JOIN DistinctCartProducts b
    ON a.CART_ID = b.CART_ID
    AND a.NAME < b.NAME  -- 2. 이름 순서 고정 (사전식 정렬)
GROUP BY a.NAME, b.NAME  -- 3. 상품 조합별 그룹화
ORDER BY X, Y;  -- 4. 결과 정렬