欢迎光临
我们一直在努力

DB2 UDB 7、ORACLE 8i、SQL SERVER 7数据库中SELECT TOP N 问题 (转发)-JSP教程,资料/其它

建站超值云服务器,限时71元/月

select top n 问题

  本贴讨论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);

  

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » DB2 UDB 7、ORACLE 8i、SQL SERVER 7数据库中SELECT TOP N 问题 (转发)-JSP教程,资料/其它
分享到: 更多 (0)