本贴讨论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: 用 rownumm1:
select * from
( select * from mytable order by ord_col desc)
where rownumm2:
select * from mytable where ord_col>=
(select min(ord_col) from
( select * from mytable order by ord_col desc)
where rownumorder by ord_col desc
注意以下两种错误用法:
wrong 1:
select * from mytable
where rowidorder by ord_col desc;
wrong 2:(因为where rownumselect * from mytable
where rownumorder 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操作,请其他朋友补充.
http://www.bkjia.com/phpjc/631200.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/631200.htmltecharticlehi, everyone: 本贴讨论select top n问题. 现在正在一家计算机公司兼职,开发asp应用. 在最近的一个商业项目里有这样一个需求:用户在查询时,只需...
