讨论: SELECT TOP N 问题

select|问题

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

时间: 2024-10-01 10:33:55

讨论: SELECT TOP N 问题的相关文章

讨论: SELECT TOP N问题 (2)

select|问题 Hi,everyone: 今天继续讨论SELECT TOP N问题. 1. DB2的M 2在前一篇讨论中提到,由于DB2的SUBQUERY不支持ORDER BY子句,因此无法构造M2. 实际上,DB2提供了一组新的函数,称为 OLAP FUNCTIONS, 可以很好的支持TOP N问题.M2:SELECT * FROM    (    SELECT MYKEY,RANK() OVER (ORDER BY ORD_COL DESC) AS MYRANK        FROM

讨论SELECT TOP N 问题

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问题就是:在SELEC

如何解决access 中 SELECT TOP 1语句竟然返回多条记录的问题?

access|select|解决|问题|语句 如何解决 SELECT TOP 1语句竟然返回多条记录的问题?    简述:如何解决 SELECT TOP 1语句竟然返回多条记录的问题    问题: 如何解决 SELECT TOP 1语句竟然返回多条记录的问题? SELECT TOP 9 title,id,hit FROM Article WHERE DATEDIFF('h',[ShowDateB],Now())>=0可以正确显示前9条 SELECT TOP 9 title,id,hit FROM

ORACLE中实现SELECT TOP N的方法

1.在ORACLE中实现SELECT TOP N 由于ORACLE不支持SELECT TOP语句,所以在ORACLE中经常是用ORDER BY跟ROWNUM的组合来实现SELECT TOP N的查询. 简单地说,实现方法如下所示: SELECT 列名1...列名n FROM (SELECT 列名1...列名n FROM 表名 ORDER BY 列名1...列名n) WHERE ROWNUM <= N(抽出记录数) ORDER BY ROWNUM ASC 下面举个例子简单说明一下. 顾客表cust

SQL 语句select top 变量问题

  今天我在写一个存储过程的时候,想动态的取若干行出来,开始用拼接字符串也可以,但是总觉得不好,就在网上查资料,找到一种方式,但是怎么也没有成功,后来终于发现是该方法不能在SQL2000中使用,只能在SQL2005以上使用. 1.拼接查询语句(SQL2000,2005,2008均可) DECLARE @a AS INT SET @a=1 EXEC('SELECT TOP '+@a+' * FROM mtrcLanguages') 2.直接使用(适用SQL2005以上) DECLARE @a AS

db2中的Select语句如何实现MSSql中Select Top n的语法功能?

问题描述 db2中的Select语句如何实现MSSql中Select Top n的语法功能? 解决方案 Select Top在不同数据库中的使用用法: 1. Oracle数据库 <CENTER><CCID_NOBR> SELECT * FROM TABLE1 WHERE ROWNUM<=N 2. Infomix数据库 SELECT FIRST N * FROM TABLE1 3. DB2数据库 SELECT * ROW_NUMBER() OVER(ORDER BY COL1

sql初级教程:select top 使用教程

sql初级教程:select top 使用教程 好了下面我们来看看在select top 的语法吧. 如mssql :select top 10 from table_name 在mysql:select * from table_name limit 0,10 SELECT TOP number|percent column_name(s) FROM table_name 下面我们来看个实例教程. _Id LastName FirstName Address City 1 Hansen Ola

Select Top在不同数据库中的使用

1. oracle数据库 SELECT * FROM TABLE1 WHERE ROWNUM<=N 2. Infomix数据库 SELECT FIRST N * FROM TABLE1 3. DB2数据库 SELECT * ROW_NUMBER() OVER(ORDER BY COL1 DESC) AS ROWNUM WHERE ROWNUM<=N 或者 SELECT COLUMN FROM TABLE FETCH FIRST N ROWS ONLY 4. SQL Server数据库 SELE

select top @rscount * from myjobs where job_id not in(select top @rscount*(@curpage-1) job_id from myjobs)

问题描述 alterprocpage@curpageint,--页码@rscountint,--每页显示记录@pagecountintoutput--记录总数asdeclare--@queryvarchar(200),@cntintselect@cnt=count(job_id)frommyjobsif@cnt%@rscount=0set@pagecount=@cnt/@rscountelseset@pagecount=@cnt/@rscount+1if@curpage<1set@curpage