'其中'条件不适用于' in'条款

时间:2014-10-25 07:32:06

标签: sql sql-server

我有三张表格如下

Orders [orderNo int]
OrderDetails [orderNo int , qty int]
StoreDocuments [docNo int, systemKey nvarChar(20)]

当我执行以下查询以获取没有任何StoreDocuments的订单时,我收到此错误

  

转换nvarchar值时转换失败'。'到数据类型int

代码:

Select 
    Sum(Dt.Qty) as SumQty
From
    Orders as [Or] 
inner join 
    OrderDetails as Dt on [Or].orderNo  = Dt.orderNo 
Where  
    [Or].orderNo NOT IN (Select SystemKey 
                         From StoreDocuments 
                         Where SystemKey <> '.')

如果StoreDocuments中的systemKey'.'没有记录,则会引发错误。

我的问题是,为什么内部查询where systemkey <> '.'中的where子句 没有像预期的那样执行它会引起错误吗?

2 个答案:

答案 0 :(得分:2)

您的异常的原因是SQL-Server尝试将您的orderNo与任何SystemKey条目匹配。它通过在比较之前将SystemKey条目转换为int来实现。你的一个条目是不可转换的,即它不是一个数字,所以你得到了你的例外。

怎么办?将orderNo转换为NVarChar然后一切都应该没问题

Select Sum(Dt.Qty) as SumQty
  From Orders o 
       inner join OrderDetails as Dt
         on o.orderNo  = Dt.orderNo 
 Where cast(o.orderNo as NVarChar) Not IN
   (
     Select SystemKey From StoreDocuments Where SystemKey <> '.'
   )

答案 1 :(得分:0)

这应该适合你:

Select Sum(Dt.Qty) as SumQty

From

Orders as [Or] inner join OrderDetails as Dt

on [Or].orderNo  = Dt.orderNo 

Where  cast([Or].orderNo as nvarchar(20))  Not IN

(

     Select SystemKey From StoreDocuments Where SystemKey <> '.'

)

sql fiddle