为什么IN运算符不能处理子查询返回的结果?

时间:2017-06-05 09:44:28

标签: sql sql-server sql-server-2008 tsql subquery

为什么操作员不工作,即什么都不返回?

Class.getClassLoader()

此查询

Select * from complaints where Code 
IN 
(select
   distinct  
    stuff((
        select ',' + QUOTENAME(cs.Code,'''')
        from MC_Complaints.dbo.Complaints cs where cs.OverDue= 1
        order by cs.Code asc
        for xml path('')
    ),1,1,'') as codeslist
from MC_Complaints.dbo.Complaints cs)

返回

select
   distinct  
    stuff((
        select ',' + QUOTENAME(cs.Code,'''')
        from MC_Complaints.dbo.Complaints cs where cs.OverDue= 1
        order by cs.Code asc
        for xml path('')
    ),1,1,'') as codeslist
from MC_Complaints.dbo.Complaints cs

但IN并没有选择任何记录,但当我把这些代码放入IN运算符时,即

'LG/17/05/0','LG/17/05/2','LG/17/05/3','Local Council Board/17/05/1','Local Council Board/17/05/10','Local Council Board/17/05/11'

然后它的工作令人惊讶,但不是在返回时,而是子查询。为什么?

1 个答案:

答案 0 :(得分:1)

stuff()的结果是字符串。仅仅因为字符串碰巧包含逗号并不意味着它是一个值列表。字符串'A,B,C'与列表'A', 'B', 'C'完全不同。

好消息是,这可以大大简化你的逻辑:

Select c.*
from complaints c
where c.code in (select cs.Code
                 from MC_Complaints.dbo.Complaints cs
                 where cs.OverDue = 1
                );

还有两点。首先,您的in表达式后跟一个列别名(codelist)。这是不允许的语法。

其次,相关的比较是:

where cCode in (
    '''LG/17/05/0'',''LG/17/05/2'',''LG/17/05/3'',''Local Council Board/17/05/1'',''Local Council Board/17/05/10'',''Local Council Board/17/05/11'''
      )

这是一个in列表,其中包含一个字符串值。