강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

hunter님의 프로필 이미지
hunter

작성한 질문수

left join 할 때

해결된 질문

작성

·

115

0

a 와 b 테이블이 있다고 가정하고

(b 테이블에 매칭되는 값이 없어도) 빠지면 안되는 정보가 있어서

강의에서 말씀하신대로 left outer join의 기준이되는 집합 테이블을 a 로 from 절에 배치했는데요

 

select * from a

left join a on a.id = b.id

이렇게 걸면 원하는 조건 (매칭되는 값이 없어도)이 정상적으로 나오는데요

 

저렇게 b테이블을 그대로 안걸고

뭔가 조건을 추가해서 left join 을 걸면 매칭되는 값은 전혀 안나오고 공통된 값만 나옵니다.

예시로

with b (

select * from b

left join a on a.id = b.id

where a.deleted = 0

and a.customerid = 1

)

select * from a

left join a on a.id = b.id

where a.customerid = 1

 

이런식으로 b테이블을 그대로 조인하는게 아니라 뭔가 조건을 준 다음에 조인하면 매칭되는 값만 나오고 값이 없는 데이터도 나와야되는데 안나와서요

from 절에 a 테이블을 기준으로해서 잡았는데도 왜 공통된 값만 나오는걸까요?

두 구문에서 어떤 차이때문에 다른 결과를 도출하는지 궁금합니다

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

님의 질문에 답변드립니다.

Hunter님 제시하신 코드 예시를 살펴보면, 주어진 쿼리에서 일부 오류가 있는 것 같습니다.

첫 번째 예시의 쿼리는 left join을 사용하시는 과정에서 a 테이블을 기준으로 b 테이블과 join하는 과정에서 오타가 있습니다.

select * from a
left join a on a.id = b.id

위 구문에서는 a 테이블을 자기 자신과 조인하려고 시도하고 있으나, 실제 의도하신 것은 b 테이블과의 조인으로 보입니다. 정정된 쿼리는 다음과 같습니다.

select * from a
left join b on a.id = b.id

두 번째 예시에서는 with 구문을 사용하여 b라는 이름의 일시적인 테이블(CTE)을 생성하려고 하지만, 이 과정에서 b 테이블을 a 테이블과 조인한 후 특정 조건(a.deleted = 0 and a.customerid = 1)을 적용하고 있습니다.

with b as (
    select * from b
    left join a on a.id = b.id
    where a.deleted = 0
    and a.customerid = 1
)

이 부분에서 문제는 where 절이 조인된 결과에 적용되어, 조건에 부합하지 않는 a 테이블의 행들이 제외되기 때문에, left join의 의도와 다르게 작용할 수 있습니다.

left join에서는 기준이 되는 테이블(a 테이블)의 모든 행이 결과에 포함되어야 합니다. where 절에 a 테이블에 대한 조건을 명시하면, 그 조건에 부합하지 않는 a 테이블의 행이 결과에서 제외되어 버립니다.

따라서, left join을 사용할 때는 조인 조건과 필터링 조건을 명확히 분리하여 적용해야 원하는 결과를 얻을 수 있습니다. left join 후에 필터링할 조건은 가능하면 조인 조건에서 처리하거나, 결과에서 필터링되지 않도록 주의해야 합니다.

질문에 직접적으로 답변되는 부분이 정보에 포함되어 있지 않지만, SQL 쿼리 작성 시 고려해야 할 일반적인 원칙에 대해 설명드렸습니다. Hunter님의 문제를 해결하는 데 도움이 되었길 바랍니다.

hunter님의 프로필 이미지
hunter

작성한 질문수

질문하기