首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • sqlserver 如何查询90万记录中的 第500到第604条数据记录? [已结帖,结帖人:DiligencyMan]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • DiligencyMan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-10-31 16:14:12 楼主
    如题:表名字 sys_type,主键名字 id
    怎么写性能比较好的sql?
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liangCK
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      2

    发表于:2008-10-31 16:16:001楼 得分:5
    SQL code
    取n到m行 1. select top m * from tablename where id not in (select top n id from tablename order by id asc/*|desc*/) 2. select top m * into 临时表(或表变量) from tablename order by columnname -- 将top m笔插入到临时表 set rowcount n --只取n条结果 select * from 表变量 order by columnname desc 3. select top n * from (select top m * from tablename order by columnname) a order by columnname desc 4.如果tablename里没有其他identity列,那么: 先生成一个序列,存储在一临时表中. select identity(int) id0,* into #temp from tablename 取n到m条的语句为: select * from #temp where id0 > =n and id0 <= m 如果你在执行select identity(int) id0,* into #temp from tablename这条语句的时候报错,那是因为你的DB中间的select into/bulkcopy属性没有打开要先执行: exec sp_dboption 你的DB名字,'select into/bulkcopy',true 5.如果表里有identity属性,那么简单: select * from tablename where identity_col between n and m 6.SQL2005开始.可以使用row_number() over()生成行号 ;with cte as ( select id0=row_number() over(order by id),* from tablename ) select * from cte where id0 between n to m
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wufeng4552
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      2

    发表于:2008-10-31 16:17:302楼 得分:5
    SQL code
    select top 500 * from (select top 604 * from sys_type order by ID) a order by ID desc
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Yang_
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      5

    发表于:2008-10-31 16:17:573楼 得分:5
    SQL code
    select top 105 * from sys_type where id not in (select top 499 id from sys_type order by id) order by id

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liuqian4243
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 16:24:324楼 得分:5
    SQL code
    select top (604-500) * from A where id > (select max(id) from (select top 500 (id) from A order by id asc) as tmpA) order by id asc



    这个前提是数据按照id列已经排序
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dawugui
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 3

      3

    发表于:2008-10-31 16:26:215楼 得分:5
    引用楼主 DiligencyMan 的帖子:
    如题:表名字 sys_type,主键名字 id
    怎么写性能比较好的sql?


    SQL code
    select m.* from tb m, ( select id , px = (select count(1) from tb where id < t.id) + 1 from tb t ) n where m.id = n.id and n.px between 500 and 604
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • csdyyr
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 16:31:126楼 得分:5
    SQL code
    select top 604-500 * from (select top 604 * from sys_type order by ID) a order by ID desc
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • minorcxx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 16:35:537楼 得分:5
    select top 105 * from 
    (select top 604 * from sys_type order by ID) a
    order by ID desc
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Liyingyue_FFS
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 16:44:318楼 得分:5
    SQL code
    select top (604-500) * from A where id > (select max(id) from (select top 500 (id) from A order by id asc) as tmpA) order by id asc
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tianhuo_soft
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 17:00:099楼 得分:5
    select top 604 * from tablename --这里查604条
    where id not in --这里做交集
    (select top 500 id from tablename) --这里只查 500条 
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • szx1999
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 19:03:5210楼 得分:5
    SQL code
    --先选出前600条,再在其中选出需要的记录,只扫描一次表 select * from ( select *,rn=row_number() over(order by id) from ( select top 604 * from sys_type order by id ) a ) b where rn between 500 and 604
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mjjzg
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 20:05:5711楼 得分:5
    又是重复性的问题,只不过换了个数字
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • DVD_01
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 23:05:0712楼 得分:5
    20005可以考虑Row_number()函数。

    SQL code
    If Object_id('Test','U') Is Not Null Drop Table Test Go Create Table Test(id int Identity(1,1) Primary Key,x bit) Insert Into Test Select Top 500000 0 From sys.all_objects ,sys.all_columns Go Delete From Test Where id=56 --删除一行,用于测试 ;With t As (Select Row=Row_number() Over (Order By id),id,x From Test) Select id,x From t Where Row Between 600 And 604 /* id x ----------- ----- 601 0 602 0 603 0 604 0 605 0 */

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • remymartin
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 23:47:2013楼 得分:10
    select top 604 ID from sys_type
    where ID not in(select top 499 ID from Sys_type)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fancydong
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-01 00:23:0814楼 得分:10
    select top (604-500) *
    from A
    where id > (select max(id) from (select top 500 (id) from A order by id asc) as tmpA)
    order by id asc
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oraclelogan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-01 00:35:5115楼 得分:10
    引用 1 楼 liangCK 的回复:
    SQL code取n到m行

    1.
    select top m * from tablename where id not in (select top n id from tablename order by id asc/*|desc*/)

    2.
    select top m * into 临时表(或表变量) from tablename order by columnname -- 将top m笔插入到临时表
    set rowcount n  --只取n条结果
    select * from 表变量 order by columnname desc

    3.
    select top n * from 
    (select top m * from tablename order by columnname)…


    正解啊!不过速度有点慢啊!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • oraclelogan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-01 00:43:4516楼 得分:10
    引用 10 楼 szx1999 的回复:
    SQL code--先选出前600条,再在其中选出需要的记录,只扫描一次表
    select * from
    (
        select *,rn=row_number() over(order by id)
        from
            (
                select top 604 *
                from sys_type
                order by id
            ) a
    ) b
    where rn between 500 and 604


    如果 是 sql2000呢?怎么办呢?
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved