主题:问个SQL语句.
linxuanxu
[专家分:9360] 发布于 2007-12-30 09:53:00
求思路:
问:有100条记录.ID为自动编号.而且ID不保证总是一个连续值.取出前10~20(含)条记录.我想问问大家有没有NB一点的方法.要求一条SQL语句搞定.
(当时由于面试中,随手答了一句)
Select Top 20 * FROM 表 Where ID not in (Select TOP 9 ID FROM 表)
(后来感觉此答案很垃圾.效率好像不是很高.又想不出别的.向大家请教.没有限定数据库类型.给些提示就行.但是要求一行写出.)
回复列表 (共14个回复)
沙发
jzyray [专家分:20610] 发布于 2007-12-30 21:29:00
如果是MySQL自然用LIMIT子句啦
如果用标准写的话~~~好像就这样吧
关注
板凳
linxuanxu [专家分:9360] 发布于 2008-01-01 20:36:00
谢谢参与.继续顶
3 楼
linxuanxu [专家分:9360] 发布于 2008-01-01 20:37:00
不过我觉得如果没有高效率的写法出这个题目有什么意义呢?
4 楼
jzyray [专家分:20610] 发布于 2008-01-03 14:59:00
出这个题目估计是考察用SQL实现分页的能力吧
5 楼
linxuanxu [专家分:9360] 发布于 2008-01-08 18:02:00
SQL语句分页?这个效率也太低了吧?
6 楼
liulei001 [专家分:12820] 发布于 2008-01-15 20:56:00
错!SQL分页才是相对节省资源的方法。
虽然服务端程序可以实现分页,但检索时数据库还是要读取全部数据,内存并没有节省。
SQL可以利用存储过程,只把所需要的数据读出来,然后返回给服务端程序。
楼主的脚本,只会提取第10至第100条数据。
最笨的方法应该是下面这个
Select *
From [表]
Where
[ID] In (Select Top 20 [ID] From [表])
And [ID] Not In (Select Top 9 [ID] From [表])
如果问题能给出排序条件,可以通过两次排序搞定。
Select Top 10 *
From
(
Select Top 20 *
From [表]
Order By [ID]
)
Order By [Id] Desc
[b][color=FF0000]注意!这时候的记录集是按ID倒序![/color][/b]
1、如果想转为正序,再嵌套一个Select就行了。
2、手头没有查询分析器,脚本没有经过验证。
3、今天总算碰到一个有点难度的问题!让我很是兴奋!谢谢楼主了。
7 楼
linxuanxu [专家分:9360] 发布于 2008-01-19 16:19:00
谢
8 楼
linxuanxu [专家分:9360] 发布于 2008-01-19 16:21:00
可是每次提取后还要对集合进行比较这个....
9 楼
liulei001 [专家分:12820] 发布于 2008-01-19 21:52:00
比较?是指筛选吗?在后面加上Where就行了。
其实一般都是用存储过程来实现数据库分页的,甚至是用临时表。不要认为这样很慢,实际的速度远超过你的想象。
10 楼
linxuanxu [专家分:9360] 发布于 2008-01-20 17:22:00
不是那个比较.我是只数据库内部的集合比较.比如有30万条记录.取出中间的15万条这样会产生一个很大的ID集合列.数据库通过not in对查询后的集合在进行比较.如果操作频繁的化压力是相当大的.当然建立索引可以提高此效率.但是如果数据又要频繁更新怎么办.所以继续期待...方法.
谢谢大家
我来回复