應該是:Select top 1 * from (select Top 4 * From tablename order by field1 ASC) tmp order by field1 DESC
N_chow(Red.pan_Nipsan) : 你好聪明哦!
提供一个苯方法 高手请别见笑 select * from table1 where aa not in(select top 3 aa from table1) and aa in(select top 4 aa from table1) order by aa 一般情况应该差不多 也有可能返回错误的数据 而且数据量大了 效率会很低
我的SQL SERVER 不支持 TOP例如:select top 3 * from table1 执行不起!请问是怎么回事?
如果对纪录排序就有行的概念了而且在实践中需要返回有序纪录的某行或某页是经常用到的 经过和N_chow(Red.pan_Nipsan) 的讨论 我进行了测试 用两种检索方法并用,速度可以提高将近一倍 (使用例子:ISAPI extension程序:网站信息管理平台 日平均添加2000条左右信息,对于一个有百万条信息的数据库,用户需要分页浏览相关信息(一般的结果集都在万条以上,分类结果10万以上),而且用户一般喜欢看某个查询结果的最新或最老的信息)*************************************************** 对于大的数据量,关键是一个查询速度问题 用VC做的程序是可以简单地用RecordSet.SetAbsolutePosition( long nRows )来完成定位的,但是对于定位靠后的纪录总是感觉速度不理想 经过你(N_chow(Red.pan_Nipsan) 的提示,我测试了两种方法并用,有点笨拙 但是速度提高了一些 共同探讨: 假定:SELECT COUNT(*) FROM myTable WHERE nColumn>100 结果是:100000,较大的结果集,小了就无所谓方法了 考虑100000/2=50000对于5万以前的纪录用 "where id not in" *****平均用时<2秒,越靠前用时越少***** 如第2万条开始的50条(ONE PAGE) SELECT TOP 50 * FROM myTable WHERE id NOT IN(SELECT TOP 20000 id FROM myTable WHERE nColumn>100 ORDER BY dAddDate DESC) ORDER BY dAddDate DESC ****用时1秒***** 如果用这种方法返回第7万条开始的50条 用时为4秒对于5万以后的纪录用排反序的办法 如第7万条开始的50条 SELECT top 50 * FROM (Select top 30000 * from Mytable WHERE nColumn>100 Order by dAddDate ASC) tmp ORDER BY dAddDate DESC ****用时1秒***** 如果用这种方法返回第2万条开始的50条 用时为4秒************************** 如果记录集更大,差异更大 第一种方法对于返回靠前的页面很快,10000条一下,<1s 第二种方法对于返回靠后的页面很快,最后10000条一内,<1s没有好的办法解决中间页面 但是总比用一个方法要好得多!
你好聪明哦!
select * from table1 where
aa not in(select top 3 aa from table1)
and aa in(select top 4 aa from table1)
order by aa
一般情况应该差不多
也有可能返回错误的数据
而且数据量大了
效率会很低
在你的資料庫中執行:EXEC sp_dbcmptlevel '你的資料庫名', 70
经过和N_chow(Red.pan_Nipsan) 的讨论
我进行了测试
用两种检索方法并用,速度可以提高将近一倍
(使用例子:ISAPI extension程序:网站信息管理平台
日平均添加2000条左右信息,对于一个有百万条信息的数据库,用户需要分页浏览相关信息(一般的结果集都在万条以上,分类结果10万以上),而且用户一般喜欢看某个查询结果的最新或最老的信息)***************************************************
对于大的数据量,关键是一个查询速度问题
用VC做的程序是可以简单地用RecordSet.SetAbsolutePosition( long nRows )来完成定位的,但是对于定位靠后的纪录总是感觉速度不理想
经过你(N_chow(Red.pan_Nipsan) 的提示,我测试了两种方法并用,有点笨拙
但是速度提高了一些
共同探讨:
假定:SELECT COUNT(*) FROM myTable WHERE nColumn>100
结果是:100000,较大的结果集,小了就无所谓方法了
考虑100000/2=50000对于5万以前的纪录用 "where id not in" *****平均用时<2秒,越靠前用时越少*****
如第2万条开始的50条(ONE PAGE)
SELECT TOP 50 * FROM myTable WHERE id NOT IN(SELECT TOP 20000 id FROM myTable WHERE nColumn>100 ORDER BY dAddDate DESC) ORDER BY dAddDate DESC ****用时1秒*****
如果用这种方法返回第7万条开始的50条 用时为4秒对于5万以后的纪录用排反序的办法
如第7万条开始的50条
SELECT top 50 * FROM (Select top 30000 * from Mytable WHERE nColumn>100 Order by dAddDate ASC) tmp ORDER BY dAddDate DESC
****用时1秒*****
如果用这种方法返回第2万条开始的50条 用时为4秒**************************
如果记录集更大,差异更大
第一种方法对于返回靠前的页面很快,10000条一下,<1s
第二种方法对于返回靠后的页面很快,最后10000条一内,<1s没有好的办法解决中间页面
但是总比用一个方法要好得多!