집 >데이터 베이스 >MySQL 튜토리얼 >WHERE 절의 오른쪽 열을 필터링할 때 LEFT JOIN이 INNER JOIN이 되는 이유는 무엇입니까?
왼쪽 조인 동작 질문: WHERE 절을 사용하여 내부 조인으로 변환
다음 SQL 문을 고려하세요.
SELECT a.foo b.bar c.foobar FROM tableOne AS a INNER JOIN tableTwo AS b ON a.pk = b.fk LEFT JOIN tableThree AS c ON b.pk = c.fk WHERE a.foo = 'something' AND c.foobar = 'somethingelse'
이 시나리오에서는 왼쪽 조인 동작이 예상됩니다. 그러나 관찰된 동작은 AND c.foobar = 'somethingelse' 절의 존재에 따라 왼쪽 조인이 내부 조인으로 변환되는 것으로 보입니다. tableThree에 해당 'somethingelse' 값이 없는 행은 반환되지 않습니다.
동작 이해
關鍵點는 WHERE 절과 LEFT JOIN 간의 상호 작용에 있습니다. . WHERE 절의 왼쪽 조인 오른쪽에 NULL이 아닌 값을 지정하면 NULL 값이 제거되어 효과적으로 내부 조인이 됩니다.
이 경우 AND c. foobar = 'somethingelse' 절은 foobar가 NULL인 tableThree의 행을 필터링합니다. 즉, tableTwo와 tableThree 모두에서 NULL이 아닌 값이 일치하는 행만 반환됩니다.
해결책
이 동작을 해결하고 의도한 왼쪽 조인을 복원하려면 다음이 필요합니다. 두 가지 옵션이 있습니다:
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
이를 추가하면 tableThree의 NULL 값이 포함되어 왼쪽 조인 동작이 유지됩니다.
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
c.foobar 조건을 조인 조건자로 이동하면 쿼리는 조인 내에서 원하는 필터링 기준을 명시적으로 지정하여 일치하는 행만 조인되도록 합니다.
위 내용은 WHERE 절의 오른쪽 열을 필터링할 때 LEFT JOIN이 INNER JOIN이 되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!