aJ.*_*aJ. 8 sql sorting oracle sql-order-by
我有一个填充了百万条记录的oracle数据库.我正在尝试编写一个SQL查询,该查询根据特定条件从数据库返回第一个"N"个排序记录(比如100条记录).
SELECT * 
FROM myTable 
Where SIZE > 2000 
ORDER BY NAME DESC
然后以编程方式选择前N个记录.
这种方法的问题是:
我的问题是:
Vin*_*rat 19
如果您的目的是找到100个随机行并在之后对它们进行排序,那么Lasse的解决方案是正确的.如果我认为您希望按名称排序前100行而丢弃其他行,则可以构建如下查询:
SELECT * 
  FROM (SELECT * 
          FROM myTable 
         WHERE SIZE > 2000 ORDER BY NAME DESC) 
 WHERE ROWNUM <= 100
优化器将理解它是一个TOP-N查询,并且能够在NAME上使用索引.它不必对整个结果集进行排序,它只会从索引的末尾开始并向后读取并在100行后停止.
您还可以向原始查询添加提示,以使优化器了解您只对第一行感兴趣.这可能会生成类似的访问路径:
SELECT /*+ FIRST_ROWS*/* FROM myTable WHERE SIZE > 2000 ORDER BY NAME DESC
编辑:只是添加AND rownum <= 100到查询将无法工作,因为Oracle rownum 在排序之前被归因:这就是你必须使用子查询的原因.如果没有子查询,Oracle将选择100个随机行,然后对它们进行排序.
小智 5
这显示了如何根据您的Oracle版本选择前N行.
从Oracle 9i开始,RANK()和DENSE_RANK()函数可用于确定TOP N行.例子:
根据工资获得前10名员工
SELECT ename,sal FROM(SELECT ename,sal,RANK()OVER(ORDER BY sal DESC)sal_rank FROM emp)WHERE sal_rank <= 10;
选择排名前10位的员工
SELECT ename,sal FROM(SELECT ename,sal,DENSE_RANK()OVER(ORDER BY sal DESC)sal_dense_rank FROM emp)WHERE sal_dense_rank <= 10;
| 归档时间: | 
 | 
| 查看次数: | 55779 次 | 
| 最近记录: |