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


176

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

 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.`

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

Answers:


229

您不能在子查询中返回两个(或多个)列以在子句中进行比较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)

83

您应该在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
它没有帮助我。给我同样的错误。指定列而不是*帮助我。
Mohammedsalim Shivani

11

它在抱怨

COUNT(DISTINCT dNum) AS ud 

在子查询中。除非您执行存在查询,否则子查询只能返回一列。我不确定为什么要在同一列上进行两次计数,从表面上看,这对您正在做的事情来说是多余的。此处的子查询只是一个过滤器,它与联接不同。也就是说,您使用它来限制数据,而不是指定要返回的列。


有时,您可以加入查询结果,这将解决问题!
JosephDoggie

5

除了此处的良好响应之外,如果您想按原样使用子查询,也可以尝试使用此方法。

方法:

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 
   )
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.