2017-12-20 48 views
0

예기치 않은 결과를 반환하는 매우 간단한 하위 쿼리를 MS SQL에 작성하고 있습니다. 내가 반환하려고하는 것은 한 기간에 존재하지만 다른 기간에는 존재하지 않는 acct 번호의 목록입니다. 내 초기 쿼리 (아래에 붙여 넣기)가 예기치 않은 0 행을 반환했습니다. 내가 서브 쿼리에 로직을 하나 개의 여분의 라인을 추가하고 예상 결과가 나에게 반환 실행할 때 이상한 결과를 반환하는 SQL 하위 쿼리

select 
    name1.acct 
from 
    sym.dbo.name as name1 
where 
    name1.processdate = 20171130 
    and name1.type = 0 
    and name1.acct not in 
    (
    select 
     name2.acct 
    from 
     sym.dbo.name as name2 
    where 
     name2.type = 0 
     and name2.processdate = 20171031 
    ) 

그러나, 아래를 참조하십시오.
select 
    name1.acct 
from 
    sym.dbo.name as name1 
where 
    name1.processdate = 20171130 
    and name1.type = 0 
    and name1.acct not in 
    (
    select 
     name2.acct 
    from 
     sym.dbo.name as name2 
    where 
     name2.type = 0 
     and name2.processdate = 20171031 
     and name2.acct <> '8888888' 
    ) 

처음에 나는 VARCHAR에 ACCT 번호를 변환 시도 (캐스팅 반대로 변환 사용) 동일한 결과를 int로 때문에이 데이터에 관련이있을 수 있습니다 입력 생각했다. 누군가가 왜 쿼리 하나가 0 결과를 반환하고 쿼리 2가 예상 된 결과를 반환했는지 설명 할 수 있습니까? 나는 특히 하위 쿼리와 함께, NOT IN를 사용하지 마십시오 마이크로 소프트 SQL 관리 Studio 2016

감사

+1

당신이 두 쿼리에 대한 결과를보고 무엇을 검증하기 위해 샘플 데이터를 표시 할 수 있습니까? –

+0

int 대신 datetime 또는 datetime 데이터 유형을 사용하는 것이 좋습니다. –

답변

3

을 사용하고

. 방금 배운대로 예상대로 작동하지 않습니다. 문제가 있습니까? 값이 NULL 인 경우 NOT IN은 모든 것을 필터링합니다.

대신 NOT EXISTS 사용

where name1.processdate = 20171130 and 
     name1.type = 0 and 
     not exists (select 1 
        from sym.dbo.name name2 
        where name2.acct = name1.acct and 
         name2.processdate = 20171031 
       );