본문 바로가기
C.W.K.
Stream
Lesson 05 of 10 · published

다중 테이블 join + Self-join

~14 min · joins, self-join, multi-table

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

3 테이블 이상

테이블을 셋 이상 붙이는 건 그냥 사슬을 잇는 거야. SQLite가 왼쪽부터 오른쪽으로 따라가. 셋을 넘어가면 alias는 선택이 아니라 필수야. 긴 이름을 그대로 쓰면 금방 눈으로 못 따라가.

Self-join은 같은 테이블에 alias를 둘 붙여서 자기 자신과 붙이는 거야. 계층 데이터(부모와 자식, 관리자와 직원), 한 칸짜리 그래프 이동, 두 row끼리의 비교에 자연스럽게 맞아.

Tip: 깊이가 정해지지 않은 재귀 계층은 WITH RECURSIVE CTE로 가. track 7에서 다뤄. self-join은 한 단계만 처리해. 깊은 트리라면 재귀 CTE 쪽이 더 일반적이고 SQLite도 그쪽을 잘 최적화해.

Code

Alias와 함께 3 테이블 join·sql
SELECT c.id, c.title,
       u.username AS owner,
       count(m.id) AS n_messages
FROM   conversations c
INNER  JOIN users u    ON u.id = c.owner_id
LEFT   JOIN messages m ON m.conversation_id = c.id
GROUP  BY c.id, u.username
ORDER  BY n_messages DESC LIMIT 10;
Self-join — 같은 이메일 도메인 user 찾기·sql
SELECT u1.username AS a, u2.username AS b,
       substr(u1.email, instr(u1.email, '@')+1) AS domain
FROM   users u1
INNER  JOIN users u2
       ON substr(u1.email, instr(u1.email, '@')+1)
        = substr(u2.email, instr(u2.email, '@')+1)
       AND u1.id < u2.id;

External links

Exercise

작은 조직도를 모델링해봐. employees(id, name, manager_id)에서 manager_id가 자기 테이블을 가리키는 FK야. 3단계 트리로 직원 열 명을 넣고, self-join으로 각 직원과 직속 상사의 이름을 짝지어 뽑아. 그다음 생각해봐. CEO까지 올라가는 전체 경로를 돌려주려면 어떻게 해야 할까? 재귀 CTE가 더 읽기 좋을까?

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.