select *  from   EnergyDataSumByMonth  where  DAMonth   in (select  StdCode  from  CodeDetail  where  StdCode  =  'Winter')
问题一:“in”不能这样用吗???
问题二:这样做发生错误。        declare  @rv  varchar(100)select  @rv = (select  StdCode  from  CodeDetail  where  StdCode  =  'Winter')
错误信息:
      消息 512,级别 16,状态 1,第 3 行
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
       怎么看“select  StdCode  from  CodeDetail  where  StdCode  =  'Winter'”的数据呢???

解决方案 »

  1.   

    select * from EnergyDataSumByMonth where DAMonth in (select StdCode from CodeDetail where StdCode = 'Winter')这样是可以的。
    declare @rv varchar(100)
     
     select @rv = (select StdCode from CodeDetail where StdCode = 'Winter')你定义的是一个字符串,但是返回的是一个结果集,或者可以理解为一个表。所以不行。你要看数据,select StdCode from CodeDetail where StdCode = 'Winter'直接执行不行吗?
      

  2.   

    第一条:
    语法正确,但是你要确认where子句中的DAMonth 和 in子句中的StdCode 是不是一回事第二条:
    语法正确,但是你必须确保select子句一定只会返回的一条记录,
    否则就会引发你看到的那段异常信息
      

  3.   

    比如你可以这样写:
    SET @rv = (select TOP 1 StdCode 
        from CodeDetail 
        where StdCode = 'Winter');
      

  4.   

    先要了解你那个赋值语句是干嘛的,不能随便使用top1
      

  5.   

    我只是举例说明确保正确使用"带有比较运算符的子查询",
    并且,实际中,TOP 1以及各种聚合函数也经常出现在子查询中
    关于这种子查询的用法,请参见MSDN:
    http://msdn.microsoft.com/zh-cn/library/ms190609(v=SQL.105).aspx
      

  6.   


    问题一:“in”不能这样用吗???
    答:可以
    问题二:这样做发生错误。
    我们撇开这样是否合理不谈
    你的代码可以改为
      declare @rv varchar(100)
    select @rv = StdCode from CodeDetail where StdCode = 'Winter'
      

  7.   

    问题1:
    (1)DAMonth、StdCode是不是可关联的?
    (2)可以用in,但检查一下in 后面的select检索出来的是不是null,或者把in换为exists也可以问题2:
    (1)子查询返回的值超过1。这是不允许在子查询中包括,!=,<,>,< =,> =或子查询是用来作为一种表达。有多个返回值。
    (2)要向这样写 select @rv = StdCode from CodeDetail where StdCode = 'Winter