Outer join guardrail

OUTER JOIN 실수는 대부분 “보존해야 할 왼쪽 행”을 중간에 지워 버릴 때 발생합니다.

매칭되는 오른쪽 행이 없어도 왼쪽 행은 남아야 하고, 오른쪽 컬럼만 NULL이 됩니다. 이 기준 하나로 흔한 실수를 빠르게 찾을 수 있습니다.

공통 판별식

LEFT JOIN 결과 행 수가 왼쪽 테이블보다 줄어들었다면, 보통 WHERE나 다음 조인이 보존 행을 다시 삭제한 것입니다.

확인 단계
잘못된 작성
결과 증상
수정 방향
오른쪽 조건 위치 매칭 조건인지, 결과 필터인지 구분
WHERE r.status = 'Y'

NULL 행이 WHERE에서 탈락합니다.

LEFT JOIN이 INNER JOIN처럼 동작

없는 오른쪽 행을 가진 왼쪽 행이 사라집니다.

ON ... AND r.status = 'Y'

오른쪽 매칭 조건으로 두면 왼쪽 보존이 유지됩니다.

NULL의 의미 값 없음이 아니라 매칭 실패 표시
COUNT(*), NOT IN

NULL을 포함한 행까지 일반 값처럼 해석합니다.

집계가 1로 잡히거나 결과가 비어 보임

매칭 실패와 실제 값이 섞입니다.

COUNT(r.id), NOT EXISTS

오른쪽 실제 매칭 여부만 기준으로 삼습니다.

조인 키 명시 스키마 변화가 조건을 바꾸지 않게 고정
NATURAL JOIN

같은 이름의 컬럼이 생기면 조건이 자동으로 늘어납니다.

왜 붙고 빠졌는지 추적하기 어려움

보존 방향과 키가 SQL에 드러나지 않습니다.

LEFT JOIN ... ON l.key = r.key

붙이는 기준과 보존 방향을 한 줄에서 확인합니다.

1. 결과 행 수가 줄었나? 줄었다면 오른쪽 조건이 WHERE에 있거나 뒤에서 INNER JOIN을 탔는지 봅니다.
2. NULL을 어떻게 세고 있나? 매칭 수는 전체 행이 아니라 오른쪽 실제 컬럼 기준으로 세야 합니다.
3. ON 절만 보고 설명 가능한가? 키와 방향이 명시되어야 운영 중 스키마 변경에도 안전합니다.