执行SQL子查询报Subquery returned more than 1 value错误,加Top1结果全为0咨询
问题原因
- 你写的用于计算
ElapsedSecond的子查询没有和外层主查询的当前行做关联约束,会返回和[dbo].[Log]全表行数一致的多个结果,而等号后的标量表达式位置不支持多值返回,因此触发报错。 - 你添加
TOP 1后,子查询永远只返回全表第一行的计算结果,所以所有行的ElapsedSecond都是同一个值,不符合业务预期。
解决方案
直接在主查询层面使用窗口函数计算即可,不需要嵌套子查询:
SELECT [Id] ,[LogTime] ,[StartTime] ,[Source] ,[Type] ,[User] ,ABS(ISNULL(DATEDIFF(second, LEAD(StartTime) OVER (PARTITION BY [Source], [User] ORDER BY StartTime), StartTime), 0)) AS ElapsedSecond FROM [dbo].[Log]
逻辑说明
LEAD窗口函数会在当前行的执行上下文中,自动取相同Source、相同User分组内,按StartTime升序排序后的下一行的StartTime值,直接计算时间差即可,不存在多值返回问题,计算结果和你给出的期望输出完全匹配。
内容的提问来源于stack exchange,提问作者RjLearn
相关产品推荐
相关产品推荐

