我的查询如下,并在其中包含一个子查询:
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.`
当我单独运行子查询时,它返回就好了,所以我假设主查询存在一些问题?
答案 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)