> 데이터 베이스 > MySQL 튜토리얼 > WHERE 절에서 오른쪽 테이블 열을 필터링할 때 내 왼쪽 조인이 내부 조인처럼 작동하는 이유는 무엇입니까?

WHERE 절에서 오른쪽 테이블 열을 필터링할 때 내 왼쪽 조인이 내부 조인처럼 작동하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-12-30 03:08:10
원래의
795명이 탐색했습니다.

Why Does My Left Join Act Like an Inner Join When Filtering on the Right Table's Column in the WHERE Clause?

왼쪽 조인 수수께끼: 내부 조인으로 바뀔 때의 마법 시간

데이터베이스 마법사 영역에서는 왼쪽 조인을 사용하여 복잡한 데이터 검색을 수행하는 것이 일반적인 관행입니다. 그러나 때때로 왼쪽 조인이 예상대로 작동하지 않습니다.

다음 쿼리를 상상해 보십시오.

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';
로그인 후 복사

흥미롭게도 c.foobar 조건이 WHERE 절에 다음과 같이 배치될 때 위에서는 왼쪽 조인으로 추정되는 것이 내부 조인으로 변환되는 것처럼 보입니다. a.foo 및 c.foobar 기준을 모두 충족하는 경우에만 결과가 반환됩니다.

왜 변형인가요? 핵심은 WHERE 절에 있습니다. WHERE 절에 왼쪽 조인(ON 절 오른쪽에 있는 테이블을 참조하여 오른쪽)의 오른쪽 값을 지정하면 모든 NULL 값이 삭제되어 왼쪽 조인이 내부 조인으로 효과적으로 축소됩니다. 간단히 말해서, c.foobar가 tableThree에 없으면 쿼리는 행을 반환하지 않습니다.

이러한 상황을 우회하려면 두 가지 옵션이 있습니다.

  1. WHERE 절을 수정하여 고려해야 합니다. 유효한 값과 NULL 값 모두 c.foobar:
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
로그인 후 복사
  1. c.foobar 조건을 Join 조건자로 이동합니다.
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
로그인 후 복사

이 솔루션 중에서 선택하는 것은 특정 솔루션에 따라 다릅니다. 쿼리 요구 사항. 그러나 WHERE 절이 있는 경우 왼쪽 조인의 기본 동작을 이해하는 것은 데이터 검색 기술을 익히는 데 중요합니다.

위 내용은 WHERE 절에서 오른쪽 테이블 열을 필터링할 때 내 왼쪽 조인이 내부 조인처럼 작동하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿