我需要在表格上按索引创建订单
Student (
roll_No,
name,
stream,
percentage,
class_rank,
overall_rank )
我希望查询类似
的内容SELECT *
FROM student
WHERE stream = 'science'
预期结果将是学生按其排名降序排列。要求是我不能在查询本身中指定order by子句。
这应该通过索引来实现(流,按class_rank desc排序)。这在oracle中是否可以实现?
答案 0 :(得分:4)
如果未指定ORDER BY子句,则Oracle不保证返回行的顺序。这个要求没有意义。
您可能会很幸运,并且发现Oracle选择的查询计划恰好按您想要的顺序返回行。但这应该是运气问题 - 甲骨文明天可以选择不同的查询计划,或者Oracle版本升级可能会产生结果变化。例如,当新版本的Oracle添加了一个更有效的分组算法而没有排序结果的副作用时,依赖于GROUP BY子句将结果作为副作用排序多年的人们感到很苦恼。
答案 1 :(得分:0)
我得到了它的工作
CREATE INDEX stream_rank_idx ON Student (stream,class_rank desc);
所以什么时候我从学生那里开始选择*,其中stream =?查询上面的索引将被使用,它将返回我想要的结果。
我认为如果我不升级oracle,它几乎总是安全的。甚至在升级之后,oracle将改变索引选择方式的可能性非常低。