- 셀프 조인이란 문법적으로 존재하는 개념은 아니고 일종의 기법에 해당한다.
- 하나의 테이블을 논리적으로 두개의 테이블 인 것 처럼 나누고 조인을 하는 방식이다.
- 예를 들어, comments 라는 댓글 테이블이 아래와 같다면,
- ( comment_id, content, root_id references comments(comment_id) )
- root_id 는 같은 테이블의 다른 데이터를 참조하는 형태이며, 이런 자기 참조를 통해 답글을 구현할 수 있다.
- 이때 답글이 아닌 일반 댓글이라면 root_id 가 없을 것이고, 답글이라면 root_id가 존재할 것이다.
- 이런 경우 댓글들을 가져오면서 연결된 답글들의 개수도 가져온다면 아래처럼 쓸 수 있다.
SELECT
c1.comment_id,
c1.content,
COUNT(c2.comment_id) AS reply_count
FROM
comments c1
LEFT JOIN
comments c2 ON c1.comment_id = c2.root_id
WHERE
c1.root_id IS NULL
GROUP BY
c1.comment_id,
c1.content;
- 이 쿼리는 모든 댓글들을 가져오면서, 각 댓글의 답글 개수까지 구하게 된다. LEFT JOIN 이므로 답글이 없는 댓글도 가져올 수 있다.
- 이런식으로 실제로는 comments 테이블 하나뿐이지만, 별칭을 활용해 논리적으로 두개의 테이블인 것 처럼 나누고 조인의 ON 조건을 적절히 적으면 셀프조인으로 자기 참조 관계를 풀어낼 수 있다.