2025.02.24 - [프로그래밍/SQL, Hive, SAS 관련 정보] - [SQL] Table of Contents
셀프 조인(Self Join)은 어떤 테이블을 자기 자신과 조인하는 방법입니다. 테이블 내에서 행 간의 관계를 분석하거나 비교할 때 유용하게 사용할 수 있습니다. 셀프 조인을 사용하는 대표적인 예를 한 번 살펴보겠습니다.
1. Hierarchical Data :
예를 들어서 테이블이 하나 있는데 여기에 Employee와 Manager가 모두 한꺼번에 들어있다고 해보겠습니다. 여기서 employer와 그 manager 관계를 조회하고 싶을 때 Self Join을 활용하면 됩니다.
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. 결과 정렬
'프로그래밍 > SQL, Hive, SAS 관련 정보' 카테고리의 다른 글
[SQL기초] Oracle/MySQL의 대표적인 용법 차이 (0) | 2025.03.22 |
---|---|
[SQL기초] 형 변환 (0) | 2025.03.22 |
[SQL문제풀이] - 명시적 Group이 없을 때 Grouping (2) (0) | 2025.03.14 |
[SQL 기초] To_date (Oracle) (0) | 2025.03.13 |
[SQL문제풀이] Join Key의 처리 (0) | 2025.03.09 |