我的查询如下所示,并在其中包含子查询:

 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)

我收到的错误是…

当子查询不是时,只能在选择列表中指定一个表达式 用exists介绍。”

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


它在抱怨

COUNT(DISTINCT dNum) AS ud 

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


你不能在子查询中返回两个(或多个)列来在WHERE A_ID in(子查询)子句中进行比较——它应该将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)

在将返回值赋给变量的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

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

方法:

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 
   )

以防它能帮助到别人,下面是我导致这个错误的原因: 我需要一个返回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)

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

SELECT t.col1,t.col2
FROM table1 t 
WHERE EXISTS (SELECT st.col1,st.col2 
               FROM table2 st
               WHERE st.fcol = t.fcol)