2012-10-04 1 views
2

나는 정말로 나를 혼란스럽게하는 문제가있다. 저는 여러분 중 한 명이 제가 간과하고있는 바보 같은 실수를 지적하길 기대하지만 실제로는 보지 않고 있습니다.겉으로보기에는 일관성없는 쿼리 결과의 원인은 무엇입니까?

나는 프로덕션 프로세스가 1 년 동안 먹이를 먹는 테이블을 가지고 있으며 우리는 고객으로부터 우리가 데이터와 일치 시키려고하는 미친 테이블을 얻었습니다. 다음 쿼리에서 tableA이 내 테이블이고 tableB이 방금 가져온 테이블입니다.

기본적인 문제는 그것이 있어야 믿을 때

select * 
from tableA 
where convert(nvarchar(30),accountNum) not in (
     select CisAC 
     from tableB 
    ) 

가 모든 레코드를 반환되지 않는 것입니다. 나는 accountNum이 tableB의 CisAC 필드와 일치하는 tableA의 레코드를 찾아야한다고 생각한다. 권리? CisAC는 nvarchar (30)이고 accountNum 필드는 bigint입니다.

select * from tableA where convert(nvarchar(30),accountNum) = '336906210032' 

반환 하나 개의 레코드 만

select * from tableB where CisAC = '336906210032' 

은하지 않습니다 : 나는 빈 반환 설정이 잘못 생각하는 이유

는 지적합니다.

그래서 무엇을 제공합니까? (그리고 당신의 시간 동안 감사합니다!)

+1

표 B에서 CisAC를 트리밍하여 공백 및 공백을 제거하는 방법은 어떻습니까? –

+0

좋은 생각이지만 공백이 없습니다. 또한 len (CisAC)이 DataLength (CisAC)의 1/2과 다른 필드를 확인했습니다. – clweeks

답변

2

이 아마 고전 not in 실수입니다. 테이블 B가 어떤 null 값이 포함 된 경우,

where convert(nvarchar(30),accountNum) not in (
     select CisAC 
     from tableB 
    ) 

는 성공하지 못할 것입니다. null에 대한 비교 unknown로 평가하기 때문에이 조건이 참 결코

where convert(nvarchar(30),accountNum) <> null and convert(nvarchar(30),accountNum) <> ... 

: 당신처럼 그것을 쓸 수 있습니다.

podiluska의 대답처럼 join으로 쿼리를 바꾸는 것이 좋습니다.

+1

완벽한, 감사합니다! – clweeks

3

내 의심이 IN

내가

select * 
from tableA 
    left join tableB 
    on convert(nvarchar(30),tableA.accountNum) = tableB.CisAC 
where tableB.CisAc is null 
3

당신의 쿼리가 올바른지 시도 할 실패의 원인이 TableB의에서 null 값이 될 것입니다. 예상 된 결과를 반환합니다.

는 SQL 바이올린 여기를 참조하십시오 : 아마 무슨 일이 일어나고 무엇 http://sqlfiddle.com/#!6/dfb5d/1

당신이 tableB에있는 데이터가 tableA의 데이터를 일치되지 않는 것입니다.

편집 : tableB null 값이있는 경우

@Andomar 대답으로, 쿼리가 실패합니다. 여기를 참조하십시오 :

http://sqlfiddle.com/#!6/05bb1/1

관련 문제