我的查询如下所示,并在其中包含子查询:
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介绍。”
当我单独运行子查询时,它返回得很好,所以我假设主查询有一些问题?
你不能在子查询中返回两个(或多个)列来在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)
以防它能帮助到别人,下面是我导致这个错误的原因:
我需要一个返回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)