您现在的位置: 雪儿网络 >> 站长学院 >> 数据库 >> 文章正文

文章标题

讨论: select top n 问题

『 更新时间:2006-10-11 』『 字体:变小 变大 』『 作者:北方网络 | 来源:不详 』
  hi, everyone:
    本贴讨论select top n问题.
    现在正在一家计算机公司兼职,开发asp应用. 在最近的一个商业项目里有这样一个需求:用户在查询时,只需要按照某(些)列排序后top 20的纪录. sql server 7很好地支持了top n 操作,但考虑到系统移植问题, 我又考虑在其他几个主流dbmss中如何实现. 鉴于只有db2 udb 7,oracle 8i,sql server 7,本贴仅讨论这三个dbms.
    简单地说,top n问题就是:在select中,仅选择按照某(些)列排序后top n的纪录. 考虑到等值问题,又可以分为两种: 一是仅仅返回n条纪录(m 1), 二是还包括所有于第n条等值的纪录(m 2). 当然最内层的子查询也可以有其他的子句, 或者top n也可以应用在没有order by的情况下,这样更简单.

1. sql server 7: 用 top n (with ties)
m1:
select top n * from mytable order by ord_col;

m2:
select top n  with ties * from mytable order by ord_col;
注: sql server 7提供了percent n with ties, access 中提供了top n,但含义是m 2.

2. oracle 8i: 用 rownum<=n
m1:
select * from
     ( select * from mytable order by ord_col desc)
where rownum<=n
m2:
select * from mytable where ord_col>=
   (select min(ord_col) from
        ( select * from mytable order by ord_col desc)
    where rownum<=n)
order by ord_col desc
注意以下两种错误用法:
wrong 1:
select * from mytable
where  rowid<=n
order by ord_col desc;

wrong 2:(因为where rownum<=n 在order by 前执行)
select * from mytable
where  rownum<=n
order by ord_col desc;

3: db2
用fetch first n rows only
m1:
select * from mytable
order by ord_col desc
fetch first n rows only
m2:
没有找到,因为db2不允许在from中嵌套有order by子句的子查询.

还不清楚oracle的m 2有没有更好的办法,以及其他的dbms如何实现top n操作,请其他朋友补充.
----------------------------------------------------------------------------------
各语句已经测试过, example:
create table mytable(mykey int, ord_col int);
insert into mytable values(1, 100);
insert into mytable values(2, 100);
insert into mytable values(3, 99);
insert into mytable values(4, 101);
insert into mytable values(5, 101);

fang  6/23/2000

 

【点击数:】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口

关文章

您的姓名:
评分等级:
1分 2分 3分 4分 5分
评论内容:
1、严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
2、用户需对自己在使用雪儿网络服务过程中的行为承担法律责任。
3、本站管理员有权保留或删除评论内容。
4、评论内容只代表网友个人观点,与本网站立场无关。
雪儿网络
copyright©2006-2008 xueol.com 鄂icp备06022161号
返回网站顶部