我知道,这是一个非常古老的问题,已经多次被问过了。
我想编写性能更好的查询,我们有超过2亿条记录,并且应该与数据库无关。
我尝试过以下查询
// MYSQL QUERY simillar to Oracle rownum(支持数据库:MYSQL,ORACLE,POSTGRESS)
SELECT RS.amt
FROM
(SELECT t.amount AS amt,
@rownum := @rownum + 1 AS rank
FROM salerecord t,
(SELECT @rownum := 0) r
ORDER BY t.amount DESC LIMIT 5) RS
WHERE RS.rank=5
//使用支持LIMIT的数据库,具有良好的性能(支持DB:MYSQL,Postgres)
SELECT amount FROM salerecord ORDER BY amount DESC LIMIT 4, 1;
//几乎所有DATABASES都没有良好的性能
SELECT amount FROM salerecord a WHERE 5 = (SELECT COUNT(*) FROM salerecord b WHERE a.amount <= b.amount) ;
答案 0 :(得分:1)
在没有LIMIT或TOP运算符的情况下,没有有效的方法在SQL中执行此操作。
对于允许增量检索结果的系统,您可以通过获取前五个记录并简单地关闭连接来模拟所需的行为。
使用LINQ在.NET框架上构建的客户端软件可以使用Take运算符。
(以上假设您的示例所需维度的排名下降。)