当未使用EXISTS引入子查询时,只能在选择列表中指定一个表达式

时间:2009-12-14 23:39:14

标签: sql sql-server tsql

我的查询如下,并在其中包含一个子查询:

 select count(distinct dNum)
 from myDB.dbo.AQ
 where A_ID in 
  (SELECT DISTINCT TOP (0.1) PERCENT A_ID, 
            COUNT(DISTINCT dNum) AS ud 
 FROM         myDB.dbo.AQ
 WHERE     M > 1 and B = 0 
 GROUP BY A_ID ORDER BY ud DESC)

我收到的错误是......

Only one expression can be specified in the select list when the subquery is not
introduced with EXISTS.`

当我单独运行子查询时,它返回就好了,所以我假设主查询存在一些问题?

5 个答案:

答案 0 :(得分:202)

您不能在子查询中返回两个(或多个)列来进行WHERE A_ID IN (subquery)子句中的比较 - 它应该将A_ID与哪个列进行比较?您的子查询必须只返回比较所需的一列到IN另一侧的列。因此查询需要采用以下形式:

SELECT * From ThisTable WHERE ThisColumn IN (SELECT ThatColumn FROM ThatTable)

您还想添加排序,以便只从顶行选择,但不需要将COUNT作为列返回以进行排序; ORDER子句中的排序与查询返回的列无关。

尝试这样的事情:

select count(distinct dNum) 
from myDB.dbo.AQ 
where A_ID in
    (SELECT DISTINCT TOP (0.1) PERCENT A_ID
    FROM myDB.dbo.AQ 
    WHERE M > 1 and B = 0
    GROUP BY A_ID 
    ORDER BY COUNT(DISTINCT dNum) DESC)

答案 1 :(得分:74)

在where查询中,您应该只返回一列和一行,并将返回值分配给变量。例如:

select * from table1 where Date in (select * from Dates) -- Wrong
select * from table1 where Date in (select Column1,Column2 from Dates) -- Wrong
select * from table1 where Date in (select Column1 from Dates) -- OK

答案 2 :(得分:10)

抱怨

COUNT(DISTINCT dNum) AS ud 
子查询中的

。除非您执行存在查询,否则只能从子查询返回一列。我不确定你为什么要两次对同一列进行计数,从表面上看它看起来多余。这里的子查询只是一个过滤器,它与连接不同。即,您使用它来限制数据,而不是指定要返回的列。

答案 3 :(得分:3)

除了这里非常好的回复之外,如果您想按原样使用子查询,也可以尝试这样做。

<强>方法

1)从子查询中选择所需的列(仅1)

2)使用映射列名称的位置

<强>代码:

 SELECT count(distinct dNum)
 FROM myDB.dbo.AQ
 WHERE A_ID in 
   (
    SELECT A_ID 
    FROM (SELECT DISTINCT TOP (0.1) PERCENT A_ID, COUNT(DISTINCT dNum) AS ud 
          FROM         myDB.dbo.AQ
          WHERE     M > 1 and B = 0 
          GROUP BY A_ID ORDER BY ud DESC
         ) a 
   )

答案 4 :(得分:3)

以防万一它对某人有帮助,以下是导致我出现此错误的原因: 我需要一个返回 json 的过程,但我省略了 for json 路径

set @jsonout = (SELECT ID, SumLev, Census_GEOID, AreaName, Worksite 
            from CS_GEO G (nolock) 
                join @allids a on g.ID = a.[value] 
            where g.Worksite = @worksite)

当我尝试保存存储过程时,它抛出了错误。我通过在程序末尾的代码中添加 for json path 来修复它:

set @jsonout = (SELECT ID, SumLev, Census_GEOID, AreaName, Worksite 
            from CS_GEO G (nolock) 
                join @allids a on g.ID = a.[value] 
            where g.Worksite = @worksite for json path)