对于ACCESS支持的SQL语法,可以看ACCESS2000的帮助,JET SQL那一部分。

解决方案 »

  1.   

    用在SQL数据库上,PARADOX不行,ORCALE不是这样的用法。还有你上面的SQL语句写错了。建议你都看点SQL的书。
    select top 10 *
    from 
    (select top 20 *
      from Table1
      order by field1 DESC )as zzz
    order by field1
      

  2.   

    这样写主要是用在sqlserver上面,只要支持top的,都可以,不过像mysql之类实现分页很简单,有个limit可以控制,oricle也有类似的操作,而sqlserver是通过ado支持实现分页,你上面的sql语句则可以直接实现分页功能了.省得ado保存状态信息!
    但是这种方法并不是很好!你看看tsql的top帮助,就明白这个语句的意思了:嵌套查出前二十条并反向排序,然后再在这二十条中查出前10条,并正向排序,不久是需要的第10到第20条纪录了!
      

  3.   

    : VSaber(☆浪人☆) 
    谢了!!!! 明天来来放分!!!!!!
      

  4.   

    VSaber(☆浪人☆) :但是这种方法并不是很好!
    好的应该怎么写呢?为什么不好?
      

  5.   

    VSaber(☆浪人☆):
    desc是对所有的记录倒序.
    语句:
    select top 20 *
    from authors
    order by au_id desc
    是取倒序排列后的记录前20条记录.即倒序取出最后20条记录,不是前20条记录. 
    嵌套三层select后,最外层语句的desc不起作用了.
      

  6.   

    话题359330的标题是: 如何查询第 11-20 条记录? (100分)
    分类:数据库-C/S型 zwhc (2000-10-07 18:42:00)  
    select top 10 * from table1
    可以获得前 10 条记录。但如果想得到第 11-20 条记录
    应该用什么命令?好象论坛里有答案,但我搜索不到。  :(
    强烈建议出精华区。 
     
    wlq (2000-10-07 18:51:00)  
    建一個唯一的索引id,然后就可以用﹕
    select  * from db where id>10 and id <21 
     
    zwhc (2000-10-07 18:57:00)  
    对不起,我所要的值是经过排序的。select top 10 from table1 order by fieldx 
     
    wlq (2000-10-07 19:03:00)  
    我早提過﹐沒人理我﹐不光要設精華區﹐還應該建個高手討論區﹐只有總排名之
    topXX才可以發言(當然wlq只有偷聽的份)﹐因為現在人和問題太多了﹐出現了
    一些問題﹐大家比較之以前(越早越好)的離線數據﹐高手越來越少﹐帖子越來越爛﹐
    最近以來﹐更有一些小丑在此上竄下跳,破壞氣氛 
     
    Jams (2000-10-07 19:05:00)  
    >> 
     
    wlq (2000-10-07 19:11:00)  
    zwhc,你的意思是不是﹐對于任給的排序字段﹐都要把符合的show出來? 
     
    fireocean (2000-10-07 19:30:00)  
    WLQ是小丑吗?你不是也在跳来跳去?不喜欢可以不来,没必要告诉大家你是小丑!!
    得罪得罪,只是想到一个悖论“世界上没有绝对地事情”。 
     
    zwhc (2000-10-07 19:43:00)  
    是呀。我记得好象有个命令,执行该命令就可以显示下 10 条
    记录;再执行,再显示下 10 条(有可能是我记错了)。 
     
    wlq (2000-10-07 22:38:00)  
    fireocean,因為你加入本論壇只有半個小時的時間﹐所以我姑且原諒你的
    無知,一邊去研究你的背論吧以下的話是說給其他朋友聽的﹕
    只要是在論壇上呆過一段時間的人就會體會到這里的變化﹐以前的大俠們都很少來了,
    一些存心搗蛋的人層出不窮﹐前一陣子出了個5415,搞的天翻地覆﹐如今又有人興風
    做浪﹐我看到一個叫sex的一個帖子﹕'這里有最A的色情站點',我感到痛心﹐更令人
    痛心的是﹐這種丑惡現象非但無人制止﹐象本人剛才那樣稍有微言﹐就遭遇一些不明
    是非的家伙的人身攻擊﹐我象大多數朋友一樣﹐對大富翁有很深的感情﹐我真希望我
    們能攜起手來﹐共同維護我們的家園﹐讓大富翁越來越好 
     
    zengr (2000-10-08 09:54:00)  
    使用CLIENTDATASET的PACKETRECORDS不可以吗? 
     
    jqw (2000-10-08 10:21:00)  
    强烈建议出精华区 
     
    hhzh426 (2000-10-08 15:06:00)  
    select top 10 fieldx order by fieldx
    获取第10个记录的fieldx的值:fieldx10
    select top 10 * where fieldx>fieldx10 order by fieldx(前提条件是fieldx不重复)
    也许那种阶段性取值的方法是这么做的!:) 
     
    zyy04 (2000-10-08 18:10:00)  
    hhzh426:我觉得你的方法,有从复扫描的嫌疑,效率不会是最高的 
     
    沈前卫 (2000-10-08 19:37:00)  
    select top 20 fieldx order by fieldx
    minus
    select top 10 fieldx order by fieldx如果索引建,应该很快。
    也可使用存储过程。 使用Cursor还不如使用上面的方法 
     
    zwhc (2000-10-08 20:24:00)  
    to 沈前卫:
    不行。  :(
    (我用的是 M$ SQL Server 7)
    ================================================
    用 order by 提示语法错误
    select top 2 * from sysobjects order by name
    minus
    select top 2 * from sysobjects order by nameServer: Msg 170, Level 15, State 1, Line 2
    Line 2: Incorrect syntax near 'minus'.
    ================================================
    不用 order by 的结果不是想要的
    select top 2 * from sysobjects -- order by name
    minus
    select top 2 * from sysobjects -- order by namename                                                                                                                             id          xtype uid    info   status      base_schema_ver replinfo    parent_obj  crdate                      ftcatid schema_ver  stats_schema_ver type userstat sysstat indexdel refdate                     version     deltrig     instrig     updtrig     seltrig     category    cache  
    -------------------------------------------------------------------------------------------------------------------------------- ----------- ----- ------ ------ ----------- --------------- ----------- ----------- --------------------------- ------- ----------- ---------------- ---- -------- ------- -------- --------------------------- ----------- ----------- ----------- ----------- ----------- ----------- ------ 
    sysobjects                                                                                                                       1           S     1      25     -2147483645 65              0           0           1998-11-13 03:00:18.827     0       64          1                S    1        113     0        1998-11-13 03:00:18.827     0           0           0           0           0           2           0
    sysindexes                                                                                                                       2           S     1      29     -2147483643 33              0           0           1998-11-13 03:00:18.827     0       32          1                S    1        8273    0        1998-11-13 03:00:18.827     0           0           0           0           0           2           0(2 row(s) affected)name                                                                                                                             id          xtype uid    info   status      base_schema_ver replinfo    parent_obj  crdate                      ftcatid schema_ver  stats_schema_ver type userstat sysstat indexdel refdate                     version     deltrig     instrig     updtrig     seltrig     category    cache  
    -------------------------------------------------------------------------------------------------------------------------------- ----------- ----- ------ ------ ----------- --------------- ----------- ----------- --------------------------- ------- ----------- ---------------- ---- -------- ------- -------- --------------------------- ----------- ----------- ----------- ----------- ----------- ----------- ------ 
    sysobjects                                                                                                                       1           S     1      25     -2147483645 65              0           0           1998-11-13 03:00:18.827     0       64          1                S    1        113     0        1998-11-13 03:00:18.827     0           0           0           0           0           2           0
    sysindexes                                                                                                                       2           S     1      29     -2147483643 33              0           0           1998-11-13 03:00:18.827     0       32          1                S    1        8273    0        1998-11-13 03:00:18.827     0           0           0           0           0           2           0(2 row(s) affected) 
     
    沈前卫 (2000-10-08 21:00:00)  
    select top 10 id from test
    where id>(
               select max(tmp.id) from (
                                     select top 10 id from test order by id
                                   ) tmp
             )  
    order by id;
    呵呵,笨办法  :))) 
     
    沈前卫 (2000-10-08 21:06:00)  
    〉是呀。我记得好象有个命令,执行该命令就可以显示下 10 条
    〉记录;再执行,再显示下 10 条(有可能是我记错了)。
      你说的是ADO吧.或者是MySQL? 
    zwhc (2000-10-08 22:00:00)  
    >>你说的是ADO吧.或者是MySQL?是呀,记得好象是有这么样的一条命令,我没用过,肯定是在
    大富翁看到的,所以我强烈要求出精华区。minus 有这功能吗?我没安装 Oracle,没办法试,如果可以的
    话,应该就是它了。在SQL 里用 not exists 替代 minus,但不支持你那种用法。在 ADO 或 MySQL 里支持这种用法吗?有本书介绍了 API 游标函数,说是可以直接从 Query Analyzer 
    这类工具中执行,但不能直接从应用程序中调用。我先研究一下
    其用法。希望能合用。(分别有如下的存储过程)
    sp_cursor
    sp_cursor_list 
    sp_describe_cursor_tables 
    sp_describe_cursor 
    sp_describe_cursor_columns  
    zwhc (2000-10-08 22:23:00)  
    “笨方法”可以用,但我还是希望能找到那条命令,沈兄不介意吧。
    做了两个用例,感兴趣的可以试试。(数据库是 pubs)1、普通使用
    select top 3 *
      from employee
      where emp_id>(select max(e2.emp_id) 
        from (select top 10 * from employee order by emp_id) e2
    )  
      order by emp_id2、可以设定起始位置
    declare @S varchar(3000),@n integer
    set @n=20  --设定起始位置
    set @S='
    select top 3 *
      from employee
      where emp_id>(select max(e2.emp_id) 
        from (select top ' + convert(varchar,@n) + ' * from employee order by emp_id) e2
    )  
      order by emp_id'
    exec(@S) 
     
    温柔一刀 (2000-10-08 22:53:00)  
    如果Oracle的minus是这个功能,当然最好。SQL server看来没有通用解决办法,两个变通办法:
    1.你们上面写的这样
    2.用ADO,指定pagesize:=10;Open;
    而后absolutePage:=2就可以到第二页(第11条开始)ps:在order by主码的情况下,你们上面写的也太麻烦了,这样就可以:
    select top 3 *  from employee where emp_id not in 
    (select top 10 emp_id from employee order by emp_id) order by emp_id
    在不order by 主码的情况下,简单用SQL语句是不可能的,只能用ADO的方式。最后一个要求:如果给我分数,请给各位数为1的(例如:61),让我的分数变成“整数” :-) 
     
    soho (2000-10-09 16:44:00)  
    select top 20 * from table1
    where a1 not in
    (select a1 from
                (select top 10 * from table1)
    )
    这里假设字段a1为表table1的值唯一的字段 
     
    zwhc (2000-10-09 17:44:00)  
    是条新思路,但有个小 bug:返回的结果集为 20 条记录 
     
    温柔一刀 (2000-10-09 19:17:00)  
    //faint!!
    我的贴子你们都没看到?555~~~~~~~~ 
     
    zwhc (2000-10-09 22:40:00)  
    看到了,怎么没给答复? sorry我从来没用过 ADO,没想到还有这种妙用,真不错。soho 的贴子刚好解决了“不 order by 主码的情况”,
    所以我说是条新思路。 
     
    温柔一刀 (2000-10-10 02:50:00)  
    >>soho 的贴子刚好解决了“不 order by 主码的情况”,怎么可能呢?他那是根本没有order,和我说的“不 order by 主码的情况”
    根本不是一回事,我是指order by field1,field2,...,或者
    order by fieldA,但fieldA不是主码。如果没有order,top有什么意义呀! 
     
    LGXing (2000-10-10 03:35:00)  
    SetRange() 
     
    shangcm (2000-10-10 10:02:00)  
    // 
     
    zwhc (2000-10-10 16:06:00)  
    to 温柔一刀:
    哦,是这样的。如果 fieldA 是 talbe1 中值唯一的字段
    (fieldA 可以是由多个字段构成的复合字段),那么用
    "... fieldA not in (select fieldA ...)..." 就可以解决
    “不 order by 主码的情况”,soho 在贴子里没说,但我
    确实是因为他的贴子而想到这种用法的。比如以下例子(数据库是 pubs):
    select top 5 *
      from employee
      where emp_id not in
    (select e1.emp_id from 
    (select top 5 * from employee order by job_id) e1)
    order by job_id
    =============================
    to LGXing:
    thanks. 
     
    zwhc (2000-10-10 16:18:00)  
    复合字段的合适例子一时找不到,先用
    “convert(char,emp_id)+minit”代替吧。select top 5 *
      from employee
      where convert(char,emp_id)+minit not in
    (select convert(char,e1.emp_id)+minit from 
    (select top 5 * from employee order by job_id) e1)
    order by job_id 
     
    charlie chen (2000-10-10 17:56:00)  
    if use ADOQuery:
    ////====记录排序====
      with ADOQuery1  do
      begin
        Close;
        Sql.Clear;
        Sql.Add('Select * from 表名 order by 字段 asc');
        Open;
      end;  ////===取记录======
      ADOQuery1.moveby(记录数)是否符合题意?^O^ 
     
    fireocean (2000-10-10 19:57:00)  
    select top 20 * from employee where fieldx not in 
    (select top 10 fieldx from employee order by fieldx) order by fieldx
    先获得前20条记录,然后从这二十条记录中将前十条记录剔除。
    前提是保证fieldx是主关键字。如果不是,则假设主关键字为"MyId",将上面
    的SQL 语句改写为
    select top 20 * from employee where MyId not in 
    (select top 10 MyId from employee order by fieldx) order by fieldx因为使用了子查询,所以效率肯定会受影响。尤其是大数据集中取数。 
    温柔一刀 (2000-10-10 21:10:00)  
    算了算了,不说了,难道我的表达能力真的那么差,就想老猫说的?不过我还是认为你们的理解能力太差,我说的话你们从来不一字一句看清楚,
    真不知道你们是怎么编程序的。>>但我确实是因为他的贴子而想到这种用法的
    我的贴子在它的之前,并且已经明确给出了这种用法,真不知道你在说什么。byebye,这道题我不再讨论了,分数也不要给我,谢谢。 
     
    zwhc (2000-10-10 21:45:00)  
    to 温柔一刀:
    你的“来自:温柔一刀 时间:00-10-8 22:53:07 ID:360126 ”
    贴子里强调“在不order by 主码的情况下,简单用SQL语句是不可能的,”select top 3 *  from employee where emp_id not in 
    (select top 10 emp_id from employee order by emp_id) order by emp_id而后我从 soho 的贴子联想到可以不“order by 主码”,
    在我的“来自:zwhc 时间:00-10-10 16:06:36 ID:361953  ”
    贴子里 order by 的是 job_id,而不是 emp_id.select top 3 *  from employee where emp_id not in 
    (select top 10 emp_id from employee order by job_id) order by job_id
                                                 ~~~~~~           ~~~~~~ 
     
    sonie (2000-10-10 22:51:00)  
    我问过ms的人了,没有直接的办法,一定要变通才行 
     
    zwhc (2000-10-11 10:12:00)  
    原以为可以在 Query Amalyzer 上执行游标函数,
    所以想弄懂其用法后结束本问。结果发现这么一段
    话“这些 API 函数都有一些选项和功能(例如定义
    游标的宽度,即行数)。这些功能不能用
     Transact-SQL 游标的语法表示”。眼睛直接花掉。那么,只能通过相应的编程环境来调用它了。不研
    究了。就此结束本问吧。
    =====================================
    温柔一刀:你的帮助最大,分数呢,你就要了吧。如
    有得罪之处,请多见谅。 
     
    zwhc (2000-10-11 10:41:00)  
    多人接受答案了。 
     
    温柔一刀 (2000-10-11 13:41:00)  
    分数无所谓,关键是你就是不仔细看我说的话!!!!!>>ps:在order by主码的情况下,你们上面写的也太麻烦了,这样就可以:
    >>select top 3 *  from employee where emp_id not in 
    >>(select top 10 emp_id from employee order by emp_id) order by emp_id
    >>在不order by 主码的情况下,简单用SQL语句是不可能的,只能用ADO的方式。我这里说得很明白,我的语句是“在order by主码的情况下”!!!而在不order by主码的情况下,是不可能的,你的那句
    “select top 3 *  from employee where emp_id not in 
    (select top 10 emp_id from employee order by job_id) order by job_id”根本是错误的,只能产生不可预料的结果(如果job_id是可以重复的话)ps:我的分数本来已经成为整数了,你这一来,又变成1了 :-) 
     
    kane (2000-10-12 17:02:00)  
    TO 温柔一刀:
        我用了ADO的RecordSet.PageSize
    但是在OPEN的时候报错,请教这是为何,或者
    可以发个DEMO给我看看嘛,谢谢啦 
     
    g622 (2000-11-19 21:56:00)  
    oracle支持top n吗? 
     charlie chen-7,hhzh426-2,LGXing-2,soho-7,sonie-7,wlq-10,zengr-2,zyy04-2,沈前卫-20,温柔一刀-41,的回答最终被接受。 
      

  7.   

    这种方法我写过,可以实现没问题,
    但是不好的地方在于,查询页数太大的时候就恐怖了,
    假如每页显示100条记录,查询第1000页,那么内部嵌套查询top 1000*100条记录,并且倒序排列,外部在进行查询前100条!效率。。!!:(
      

  8.   

    cyj:你好!我给你提供的SQL 语句在SQL SERVER 中可用。select top 10 *
    from 
    (select top 20 *
      from Table1
      order by field1)as zzz
    order by field1 DESC其中 DESC  不能去掉,而且导出表中的 20 不能改为 10。我给你分析一下原因:这个SQL语句中用了一个导出表(其实是一个中间结果集)实现,即
    select top 20 *
      from Table1
      order by field1 
    部分。导出表部分实现了  从Table1中找出按field1 升序排序的前  20 记录;然后再用
    select top 10 *
    from 
    (导出表)as zzz
    order by field1 DESC
    从导出表中选出按field1 降序排序的前 10 条记录,即为Table1中的第10 到20 条记录。明白了吗?
      

  9.   

    to V_Lucky(Lucky) 对这样做是对的 但出来的记录是原来表中的的第20~11因为是DESC吗 可不可以是11~20呢!
    我这么写
    select top 10 *
    from 
    (select top 20 *
      from Table1
      order by field1DESC)as zzz
    order by field1 
    是最后的20中的1~10条是不可以的 
    谢谢你们大家至少让我学到了很多!!!!!!
      

  10.   

    select top 10 *
    from
    (select top 10*
    from
    (select top 20*)
      from table1
      order by field1) as zzz
    order by field1 desc ) as aaa
    order bye field1
      

  11.   

    to qiubolecn(来自差生市)   反应好快的呢你 理论上是这样的