roc*_*kit 164 sql t-sql sql-server exists
我的查询如下,并在其中包含一个子查询:
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)
Run Code Online (Sandbox Code Playgroud)
我收到的错误是......
Only one expression can be specified in the select list when the subquery is not
introduced with EXISTS.`
Run Code Online (Sandbox Code Playgroud)
当我单独运行子查询时,它返回正常,所以我假设主查询存在一些问题?
Chr*_*tta 217
您不能在子查询中返回两个(或多个)列来进行WHERE A_ID IN (subquery)
子句中的比较- 它应该与哪个列进行比较A_ID
?您的子查询必须只返回比较所需的一列到另一侧的列IN
.所以查询需要具有以下形式:
SELECT * From ThisTable WHERE ThisColumn IN (SELECT ThatColumn FROM ThatTable)
Run Code Online (Sandbox Code Playgroud)
您还想添加排序,以便只从顶行选择,但不需要将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)
Run Code Online (Sandbox Code Playgroud)
小智 81
您应该在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
Run Code Online (Sandbox Code Playgroud)
Jim*_*m L 10
它在抱怨
COUNT(DISTINCT dNum) AS ud
Run Code Online (Sandbox Code Playgroud)
在子查询中.除非您执行存在查询,否则只能从子查询返回一列.我不确定你为什么要两次对同一列进行计数,从表面上看它看起来多余.这里的子查询只是一个过滤器,它与连接不同.即您使用它来限制数据,而不是指定要返回的列.
除了这里非常好的响应之外,如果您想按原样使用子查询,您也可以尝试这样做。
方法:
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
)
Run Code Online (Sandbox Code Playgroud)
小智 6
以防万一它对某人有帮助,这就是导致我出现此错误的原因:我需要一个返回 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)
Run Code Online (Sandbox Code Playgroud)
当我尝试保存存储过程时,它引发了错误。我通过在过程末尾添加代码的 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)
Run Code Online (Sandbox Code Playgroud)