Oracle SQL:按分组筛选指定Stop_number区间内的行
解决Oracle SQL的ORA-01427错误并实现分组筛选需求
错误原因
你遇到的ORA-01427: single-row subquery returns more than one row错误,是因为原SQL中的子查询没有按Groups分组过滤,导致返回了所有分组中Stop_number=20231和Stop_number=21567的多条Sort_Sequence值,而>=/<=运算符要求子查询只能返回单行结果,因此触发错误。
正确查询写法
根据你的需求(按Groups分组,筛选每个组内Sort_Sequence介于该组Stop_number=20231和Stop_number=21567对应值之间的行),提供两种可靠写法:
写法1:使用CTE+分组聚合(推荐,性能更优)
先预计算每个分组的Sort_Sequence边界,再关联原表筛选:
WITH group_sort_bounds AS ( SELECT Groups, -- 取该组Stop_number=20231对应的Sort_Sequence(若有多条取最大值,可根据需求换MIN) MAX(CASE WHEN Stop_number = 20231 THEN Sort_Sequence END) AS lower_bound, -- 取该组Stop_number=21567对应的Sort_Sequence(若有多条取最小值,可根据需求换MAX) MAX(CASE WHEN Stop_number = 21567 THEN Sort_Sequence END) AS upper_bound FROM your_table -- 替换为你的实际表名 GROUP BY Groups ) SELECT t.Groups, t.Sort_Sequence, t.Stop_number FROM your_table t JOIN group_sort_bounds gb ON t.Groups = gb.Groups WHERE t.Sort_Sequence BETWEEN gb.lower_bound AND gb.upper_bound;
写法2:使用关联子查询(适合简单场景)
针对每行的Groups,动态查询对应分组的边界值:
SELECT Groups, Sort_Sequence, Stop_number FROM your_table t -- 替换为你的实际表名 WHERE Sort_Sequence >= ( SELECT MAX(Sort_Sequence) FROM your_table WHERE Groups = t.Groups AND Stop_number = 20231 ) AND Sort_Sequence <= ( SELECT MIN(Sort_Sequence) FROM your_table WHERE Groups = t.Groups AND Stop_number = 21567 );
注意事项
- 若每个分组中
Stop_number=20231或21567存在多条记录,需根据业务逻辑选择MAX()或MIN()来确定边界值; - 若你的需求只是直接筛选所有分组中
Stop_number在20231到21567之间的行,可简化为:SELECT Groups, Sort_Sequence, Stop_number FROM your_table WHERE Stop_number BETWEEN 20231 AND 21567;
内容的提问来源于stack exchange,提问作者ritarita
相关产品推荐
相关产品推荐

