해결된 질문
작성
·
115
0
a 와 b 테이블이 있다고 가정하고
(b 테이블에 매칭되는 값이 없어도) 빠지면 안되는 정보가 있어서
강의에서 말씀하신대로 left outer join의 기준이되는 집합 테이블을 a 로 from 절에 배치했는데요
select * from a
이렇게 걸면 원하는 조건 (매칭되는 값이 없어도)이 정상적으로 나오는데요
저렇게 b테이블을 그대로 안걸고
뭔가 조건을 추가해서 left join 을 걸면 매칭되는 값은 전혀 안나오고 공통된 값만 나옵니다.
예시로
with b (
select * from b
where a.deleted = 0
and a.customerid = 1
)
select * from a
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님의 문제를 해결하는 데 도움이 되었길 바랍니다.