--10%~20%
select top 10 PERCENT from 表名 
where 主键 not in (select top 10 percent 主键 from 表 order by 排序字段)
order by 排序字段--20%~30%
select top 10 PERCENT from 表名 
where 主键 not in (select top 20 percent 主键 from 表 order by 排序字段)
order by 排序字段

解决方案 »

  1.   

    select identity(int,1,1) as rowid,* into #t from tnameselect 
        top 10 PERCENT *
    from 
        #t 
    where 
        rowid not in (select top 10 percent rowid from 表 order by rowid)
    order by 
        rowidselect 
        top 10 PERCENT *
    from 
        #t 
    where 
        rowid not in (select top 20 percent rowid from 表 order by rowid)
    order by 
        rowid
      

  2.   

    -- 11-20
    SELECT TOP 10 * FROM 表 WHERE 主键>(SELECT MAX(主键) FROM (SELECT TOP 10 主键 FROM 表 ORDER BY 主键) A) ORDER BY 主键-- 21-30
    SELECT TOP 10 * FROM 表 WHERE 主键>(SELECT MAX(主键) FROM (SELECT TOP 20 主键 FROM 表 ORDER BY 主键) A) ORDER BY 主键
      

  3.   


    select identity(int,1,1) TID,* into #Temp from TGetvaluedeclare @iMax int,@iPercentOne decimal(18,2),@iPercentTwo decimal(18,2)
    select @iMax=max(TID) from #Temp
    select @iPercentOne =0.2,@iPercentTwo=0.3select * from #Temp
    where TID between round(@iMax*@iPercentOne,0) and round(@iMax*,@iPercentTwo,0)
      

  4.   

    不晚,我是搬好凳子来学习的!综合上述,
    1.如果有key值,那么将是很到达到目的!本来你要按照第几行来取,玩的就是类似rowid,有key值,就相当于每行都有个序号,我是一号,不管我排在第一还是中间,都可以区别开来!所以只要有key值,完全可以 vivianfdlpw(), xueguang(xg) 的方法,他的方法也是等价于这样:
    select top 10 PERCENT from 表名 A1
    where not exists(select top 1 A1.key字段  from (select top 10 percent key字段 from 表)A2 where A2.key字段 = A1.key字段)---/*这里不用排序,就是取物理顺序,这样遇到有key值,但是排序杂乱无章的也是ok!*/2. libin_ftsafe(子陌红尘), Hopewell_Go的方法就是死马当活马医,人称D.I.Y自制ROWID的临时表造序号!好多那种非常刁难的报表格式,用此法,保管制的死死的,呵呵!
      

  5.   

    Hopewell_Go的才对!!!别的都不严谨。
      

  6.   

    几百万条目前还没有达到可以以光速的速度跑到你面前,呵呵!开玩笑啦!资料多,当然速度是有所影响!除了优化(用临时表(libin_ftsafe(子陌红尘), Hopewell_Go的方法)的方法速度不快)语句,可以从其他途径来提速
      

  7.   


    --简单测试了一下各语句的执行效率,查询出的结果一致,各语句都不是首次执行,因此物理读和预读都是0,测试表有二十多万条记录,有主键
    select top 10 * from TEST  
    where ID not in (select top 100000 ID from TEST order by ID)
    /*
    SQL Server 分析和编译时间: 
       CPU 时间 = 10 毫秒,耗费时间 = 13 毫秒。(所影响的行数为 10 行)表 'TEST'。扫描计数 2,逻辑读 7064 次,物理读 0 次,预读 0 次。SQL Server 执行时间: 
       CPU 时间 = 369 毫秒,耗费时间 = 369 毫秒。
    */select top 10 * from TEST A1
    where not exists(select top 1 A1.ID  from (select top 100000 ID from TEST)A2 where A2.ID = A1.ID)/*
    SQL Server 分析和编译时间: 
       CPU 时间 = 13 毫秒,耗费时间 = 13 毫秒。(所影响的行数为 10 行)表 'TEST'。扫描计数 2,逻辑读 7064 次,物理读 0 次,预读 0 次。SQL Server 执行时间: 
       CPU 时间 = 371 毫秒,耗费时间 = 404 毫秒。
    */SELECT TOP 10 * FROM TEST WHERE ID>(SELECT MAX(ID) FROM (SELECT TOP 100000 ID FROM TEST ORDER BY ID) A)/*
    SQL Server 分析和编译时间: 
       CPU 时间 = 10 毫秒,耗费时间 = 12 毫秒。(所影响的行数为 10 行)表 'TEST'。扫描计数 2,逻辑读 3535 次,物理读 0 次,预读 0 次。SQL Server 执行时间: 
       CPU 时间 = 120 毫秒,耗费时间 = 120 毫秒。*/
      

  8.   

    xueguang(xg),MorningTea(一勺抹茶) 十分感谢 热心回复,关于查询效率的问题,应该是属于另一问题了,会另开帖给分