子查询返回所有值,然后应用where条件

时间:2015-03-16 22:50:14

标签: sql-server subquery

即使数据几乎相似,我在一个特定环境/数据库中遇到查询问题。以下是简化方案:

表A - 一列 - Id(长)

Id
1
2
3

表B - 两列 - 值(varchar)和field2(varchar)

  Value Field2
1)abc   NotKey
2)Test  NotKey
3)1     Key
4)1.56  NotKey

当我运行查询时

select * from table a
where id in(select value from table b where Field2 = 'Key')

我收到错误

结果:转换varchar值时转换失败' abc' (早些时候我将这个值作为' NotKey')数据类型为int。

在一个数据库上。在其他三个数据库中,该值正确返回为" 1"。

我正在使用SQL Server 2008.这可能是什么问题?

2 个答案:

答案 0 :(得分:1)

您必须在此实例中有一条记录,该记录不会像以前一样遵循相同的模式。尝试运行以下查询以查找错误数据。您可以修复记录,也可以对您正在使用的查询添加数字检查。

select *
from table
where Field2 = 'Key'
    and (ISNUMERIC(Value) = 0
        OR CHARINDEX('.', Value) > 0);

过滤后的查询:

select *
from table a
where id in
(
    select value
    from table b
    where Field2 = 'Key'
        and ISNUMERIC(value) = 1
        and CHARINDEX('.', Value) = 0
);

答案 1 :(得分:1)

您为导致错误的过滤器提供了错误的过滤器。

只有在您选择:

时才会发生错误
select * from tablea
where id in(select value from tableb where Field2 = 'NotKey')

您必须投射其中一列

select * from tablea
where cast( id as nvarchar(20)) in(select value from tableb where Field2 = 'NotKey')

http://sqlfiddle.com/#!6/e9223/23