214

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

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

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

4

6 回答 6

272

您不能在子查询中返回两个(或多个)列来在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)
于 2009-12-15T00:09:34.840 回答
98

您应该在将返回值分配给变量的 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
于 2011-10-07T08:13:22.257 回答
14

它在抱怨

COUNT(DISTINCT dNum) AS ud 

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

于 2009-12-14T23:56:19.563 回答
6

除了这里有很好的响应外,如果您想按原样使用子查询,您也可以尝试这样做。

方法:

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

2)使用where来映射列名

代码:

 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 
   )
于 2018-04-23T15:52:14.457 回答
5

以防万一它对某人有所帮助,这就是导致我出现此错误的原因:我需要一个返回 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 路径添加到代码来修复它:

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)
于 2020-12-22T19:16:01.670 回答
0

对于子查询中的投影,您可以使用

SELECT t.col1,t.col2
FROM table1 t 
WHERE EXISTS (SELECT st.col1,st.col2 
               FROM table2 st
               WHERE st.fcol = t.fcol)
于 2022-02-25T18:10:34.007 回答