2014-03-04 3 views
0

이것은 SQL Server 2012를 사용하고 있습니다.SQL 내부 조인 후 왼쪽으로 조인 3 테이블

3 조의 테이블로 왼쪽 조인을 사용하고 싶습니다.

계획이다

  • 는 테이블 S의 행의리스트를 가지고,
  • 가 s.pid = v.pid 및 v.pro = 'P'및 = s.reg하여 표 V에 대응 'U'는 v.categoryid되는 = 8
  • 그리고, 로그 처리 (테이블 L)
  • 가 L.pid = v.pid 및 L.pro = v.pro
하여 표 V에 대응하고있다

나는 exi가 아닌 세트를 찾고 싶습니다. 테이블 L에 박혀 있다는 것은 전에 처리 된 적이 없음을 의미합니다.

내가 쓴 :

select top 100 
    s.* 
from 
    S 
inner join 
    V on s.pid = v.pid 
left join 
    L on L.pid = v.pid and L.pro = v.pid 
where 
    s.reg = 'u' 
    and v.pro = 'p' 
    and v.categoryid = 8 
    and L.pid is null 
    and L.pro = 'p' 

이 그것이 효과 것, 아무것도 ...

+0

'TOP 선택 ...'

and L.pro='p' 

and (L.pro IS NULL OR L.pro='p') 

이상의

에 변경 것인가? 적절한 db 기술 태그를 추가하는 것이 좋습니다. – ChicagoRedSox

+0

@ChicagoRedSox는 MsSQL 일 수 있습니다. 나는'top'이 존재하지 않을 것이라고 생각했지만, OP는 SQL이라고 생각합니다. – Sebastien

+0

@Sebastien - MySQL에서는 질의가 끝나면 SELECT ... LIMIT X입니다. – ChicagoRedSox

답변

0

당신 left join 만약 테이블을 도울하고 그렇지 null 값을 동일하게 열을의 필터링하세요 반환 조인을하지 않은 경우를 포함하여 해당 테이블의 null 값을 필터링하십시오.

이 문제가 발생하지 않도록하려면 null 값을 처리해야합니다. 이 SQL 서버는 - 예를 들어, 당신은 단순히

and ISNULL(L.pro, 'p') = 'p' 
+0

당신이 옳습니다! 그냥 제거하면 "L.pro = 'p'"작동합니다! 감사 –