>데이터 베이스 >MySQL 튜토리얼 >WHERE 절의 오른쪽 열을 필터링할 때 LEFT JOIN이 INNER JOIN이 되는 이유는 무엇입니까?

WHERE 절의 오른쪽 열을 필터링할 때 LEFT JOIN이 INNER JOIN이 되는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-29 14:47:11741검색

Why Does a LEFT JOIN Become an INNER JOIN When Filtering on a Right-Side Column in the WHERE Clause?

왼쪽 조인 동작 질문: 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이 아닌 값이 일치하는 행만 반환됩니다.

해결책

이 동작을 해결하고 의도한 왼쪽 조인을 복원하려면 다음이 필요합니다. 두 가지 옵션이 있습니다:

  1. WHERE 수정 절:
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)

이를 추가하면 tableThree의 NULL 값이 포함되어 왼쪽 조인 동작이 유지됩니다.

  1. 조인으로 이동 조건자:
LEFT JOIN tableThree AS c ON b.pk = c.fk
AND c.foobar = 'somethingelse'

c.foobar 조건을 조인 조건자로 이동하면 쿼리는 조인 내에서 원하는 필터링 기준을 명시적으로 지정하여 일치하는 행만 조인되도록 합니다.

위 내용은 WHERE 절의 오른쪽 열을 필터링할 때 LEFT JOIN이 INNER JOIN이 되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.