问题描述
|
我需要按表上的索引创建订单
Student (
roll_No,name,stream,percentage,class_rank,overall_rank )
我想查询类似的东西
SELECT *
FROM student
WHERE stream = \'science\'
预期的结果是学生将按其排名从高到低的顺序排列。要求是我不能在查询本身中指定order by子句。
这应该通过对(流,按class_rank desc排序)上的索引来实现。这在甲骨文中可以实现吗?
解决方法
如果您未指定ORDER BY子句,则Oracle不保证返回行的顺序。该要求没有任何意义。
您可能会很幸运,发现Oracle选择了一个查询计划,该计划恰好按您想要的顺序返回行。但这是个运气问题– Oracle明天可以选择其他查询计划,否则Oracle版本升级可能会导致结果更改。例如,当新版本的Oracle添加了更高效的分组算法而又没有对结果进行排序的副作用时,那些多年依赖GROUP BY子句对结果进行排序的人感到不安。
, 我知道了
CREATE INDEX stream_rank_idx ON Student (stream,class_rank desc);
所以当我从学生那里选择流*时选择*查询上面的索引将被使用,它将返回我想要的结果。
而且我认为,如果我不升级oracle,它几乎总是安全的。即使升级后,Oracle更改索引选择方式的可能性也很小。