我试图比较一个表和一个报告表作为测试证明,报告表包含一个12个字符的ID加上它们的DOB,而源表只有一个ID。
select cast(ID as char(12)) as ID into #IDnums
from members
where client='some_client'
select ID
from #IDnums
where ID not in (
select left(12,rtrim(ltrim(memberID)))
from report_table
)
memberID是char(50)字段。当我运行这个时,我收到错误:
varchar值的转换' 74857358238119880131'溢出了一个int列。
我不知道varchar或int的来源,或者如何解决这个问题。
答案 0 :(得分:2)
使用left()
时,第一个参数是字符串,第二个参数是长度。
因此,它将memberid
上的表达式解释为整数。这就是转换失败的地方。你想要:
select ID
from #IDnums
where ID not in (select left(rtrim(ltrim(memberID)), 12) from report_table);
我认为将not in
与子查询一起使用是一个坏习惯。如果memberId
永远是NULL
,会出现问题。在这种情况下,not in
根本不返回任何行。这就是为什么我建议改为使用not exists
。
我也不清楚为什么要使用临时表。这样做是否符合你的要求:
select id
from members m
where not exists (select 1
from report_table rt
where left(rt.memberId, 12) = cast(m.id as varchar(12))
);
或:
select id
from members m
where not exists (select 1
from report_table rt
where rt.memberId like concat(m.id, '%')
);