回 帖 发 新 帖 刷新版面

主题:问个SQL语句.

求思路:
问:有100条记录.ID为自动编号.而且ID不保证总是一个连续值.取出前10~20(含)条记录.我想问问大家有没有NB一点的方法.要求一条SQL语句搞定.

(当时由于面试中,随手答了一句)
Select Top 20 * FROM 表 Where ID not in (Select TOP 9 ID FROM 表)
(后来感觉此答案很垃圾.效率好像不是很高.又想不出别的.向大家请教.没有限定数据库类型.给些提示就行.但是要求一行写出.)

回复列表 (共14个回复)

沙发

如果是MySQL自然用LIMIT子句啦
如果用标准写的话~~~好像就这样吧
关注

板凳

谢谢参与.继续顶

3 楼

不过我觉得如果没有高效率的写法出这个题目有什么意义呢?

4 楼

出这个题目估计是考察用SQL实现分页的能力吧

5 楼

SQL语句分页?这个效率也太低了吧?

6 楼

错!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 楼

8 楼

可是每次提取后还要对集合进行比较这个....

9 楼

比较?是指筛选吗?在后面加上Where就行了。

其实一般都是用存储过程来实现数据库分页的,甚至是用临时表。不要认为这样很慢,实际的速度远超过你的想象。

10 楼

不是那个比较.我是只数据库内部的集合比较.比如有30万条记录.取出中间的15万条这样会产生一个很大的ID集合列.数据库通过not in对查询后的集合在进行比较.如果操作频繁的化压力是相当大的.当然建立索引可以提高此效率.但是如果数据又要频繁更新怎么办.所以继续期待...方法.

谢谢大家

我来回复

您尚未登录,请登录后再回复。点此登录或注册