我现在有一个表news,里面包含100W条数据。我要取其中时间从2006-05-04到2006-08-01之间的数据当中的第100到109条,SQL怎么写查询效率才最高?谢谢!

解决方案 »

  1.   

    select id=identity(int,1,1),* into #t from news where date1 between '2006-05-04' and '2006-08-01'select * from #t where id between 100 and 109
      

  2.   

    这个是不错,但不是最有效率的SQL麻烦楼上的再想想啊!!!
      

  3.   

    select top 9 * from news
    where date not in (select top 100 date from news where date >'2006-05-04') and date >'2006-05-04'
      

  4.   

    select top 9 * from 
     (select top 109 * from news where date>'2006-5-4' and date<'2006-8-1' order by date)
     order by date desc
      

  5.   


    select top 9 * from  
     (select top 109 * from news where date > '2006-5-4 ' and date < '2006-8-1 ' order by date)  A
     order by date desc
      

  6.   

    设id为标识列
    或设id为非标识列,但是程序自动加上去的如 '0000001' ,'000002' ,'00000N, '999999'这样的可以排序,可以比较大小的列, PRIMARY如果news表没有这样的列(当然,列名,或若是非标识列时,编码算法可以不同),你可以直接GG了,不用答了在id上建立聚集索引,顺序排列--首先取数据的id大致区间范围,我假设fdate是新闻的发布时间,而不是修改时间,那么id的区间跟fdate的区间的走势是一样的。
    --如果fdate要取的是修改时间,请勿用此方法,因为id走势跟fdate就不一样了,取的数据就是错的。
    declare @maxid int,@minid int --若是varchar型,就varchrchar(长度)
    select @minid=max(id) from news where fdate<'2006-5-4'
    select @maxid=min(id) from news where fdate>'2006-8-1'--还可以根具@minid和@maxid的区间中的记录数来确定是否需要生成区间内的记录的临时表。select top 10 * from news where id between @minid and @maxid
    and id>(select max(id) from
    (select top 99 id from tb where id between @minid and @maxid and fdate between '2006-05-04 ' and  '2006-08-01') x
    )在实际使用中,数据统计,需要做一些定期的维护,或对数据的分析。可以是手工的,也可以是job跑,将一些统计数据放在维护表。 比如 你的站点首页总是放了最新新闻,本月点击排行,本周点击排行,将上月最大id存放在维护表里,那么使用id区间,对于效率很有用。
      

  7.   

    如果是手工的,比如你在今年月初查了一次以前的数据得到了minid的值,那么就将项目里的sql语句改为 .. where id>这个值
    到下个月时,再查一次. 程序每次都要查一次maxid的值没有意义.
      

  8.   

    后来面试官说用TOP加嵌套查询就可以了。。不过我不知道怎么查到第100条记录,所以来问问看看大家有没有什么新奇的招式?谢谢啦!
      

  9.   

    id between @minid and @maxid 是为了查询效率而加的条件,你自己把这个条件去掉,仔细看,看我选的是109中的 100-109还是 1-9
      

  10.   

    这种写法的来源:
    02年我写论坛时,为了提高页面执行效率,想了一个办法.
    表中有identity列, id ,primary 如果按id来分页排序, 每页显示 15 条, 那么 第一页显示就是 id bewteen 1 and 15
    第二页, id between (@page-1)*pageNum+1 and @page*pageNum
    这样,只用一个page和pageNum参数就可以在每一个页只取pageNum条记录.  速度是相当快的.
    但这种想法有问题,当数据进行过删除后,id不连续,那么某些页面选取的数据数可能就小于15,甚至一条都没有
    后来,有个朋友写了另一种方法 
    select top pageNum * from tb where id not in(select top pageNUm*(page-1) id from tb)
    (我这里的pageNum和page都是用来表示的,不代表语法问题)
    但这种分页有个问题, 前几页很快,越到后面,子查询里数据越多,也即页面page数越大,查询越慢再到后来,我们将写法改进了
    select top pageNum * from tb where id>(select max(id) from (select top pageNum*(page-1) id from tb))
    虽然也是越到后面越慢,但二者比较的是id的大小,二不是用in去匹配.当然,我们当时确实是这样弄的, 也可能早有很多人先我们就采用了这种方法,只是我们当初不知道.
      

  11.   

    SQL 2005里可以一句话搞定:With x As
    (select *, row_number() over(order by date1) as rowNum from news 
     where date1 between '2006-05-04' and '2006-08-01')select * from x
    where rowNum between 100 and 109
      

  12.   

    sql2000当然也可以一句话搞定. 不过, 这样的查询,一句的语句通常都不高效的.
      

  13.   

    不过面试官说了要用TOP和嵌套查询,不用临时表的
      

  14.   

    问下楼上,用的那个写SQL CODE的工具是什么?好像很多人用哈,怎么我不知道的