← 질문 목록
#50깊이 0
ANTI JOIN과 SEMI JOIN의 차이는?
SEMI JOIN은 서브쿼리 조건에 일치하는 메인 테이블 행만 반환하고, ANTI JOIN은 일치하지 않는 행만 반환하는 차이점이 있다.
| 기준 | SEMI JOIN | ANTI JOIN |
|---|---|---|
| 추출 조건 | 우측에 존재함 (EXISTS) | 우측에 존재하지 않음 (NOT EXISTS) |
| 결과 행 | 매칭되는 메인 테이블 행 | 매칭 없는 메인 테이블 행 |
| 주요 용도 | IN, EXISTS 최적화 | NOT IN, NOT EXISTS 최적화 |
두 조인 모두 우측 데이터를 결과에 붙이지 않고 일치 여부만 검사한다.
중첩 루프로 풀면 일치가 확인되는 순간 우측 탐색을 멈춘다. 해시로 풀면 우측을 먼저 다 읽어 해시 표를 만든다. 일반 INNER JOIN처럼 중복 행이 늘어나지 않아서 별도의 DISTINCT 연산 없이도 메인 테이블의 원본 고유성을 유지한다.
ANTI JOIN에서는 NULL 의미론을 특히 조심해야 한다. 우측 테이블 컬럼에 NULL이 존재하면 NOT IN 서브쿼리가 ANTI JOIN으로 변환될 때 전체 결과가 빈 집합으로 변할 수 있다.