Oracle查询优化:无需子查询获取最大COL2值行的替代方案
无需子查询的Oracle改写方案
嘿,针对你要获取COL2值最大行的需求,这里有几个不用子查询的简洁方案,适配不同版本的Oracle:
方案1:使用FETCH FIRST(Oracle 12c及以上)
这是最直观的写法,排序后直接取目标行,还能完美处理多个COL2值相同且为最大值的情况:
SELECT COL1, COL2 FROM TABLE ORDER BY COL2 DESC FETCH FIRST 1 ROW WITH TIES;
- 说明:
ORDER BY COL2 DESC把COL2最大的行排到最前面,FETCH FIRST 1 ROW WITH TIES会返回所有COL2等于最大值的行(如果只有一行最大值,就返回那一行)。如果只需要任意一行最大值(不关心重复行),可以去掉WITH TIES写成FETCH FIRST 1 ROW ONLY。
方案2:使用Oracle特有的KEEP子句(适用于所有版本)
如果你的Oracle版本低于12c,用KEEP子句结合聚合函数也能实现,完全不需要子查询:
SELECT MAX(COL1) KEEP (DENSE_RANK LAST ORDER BY COL2) AS COL1, MAX(COL2) AS COL2 FROM TABLE;
- 说明:
DENSE_RANK LAST ORDER BY COL2会定位到COL2最大的分组,MAX(COL1)会返回该分组里的COL1(如果有多个相同最大COL2的行,这个写法会取COL1最大的那个;如果需要保留所有行的话,这个方案更适合单一行或者接受聚合结果的场景)。
内容的提问来源于stack exchange,提问作者Akhilesh
相关产品推荐
相关产品推荐

