讨论: 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 MYTABLE ) AS RANKED_TABLE
WHERE MYRANK<=N

利用OLAP函数,除了上一篇中所提方法,DB2的M1又可以表示为:
SELECT * FROM
   (    SELECT MYKEY,ROW_NUMBER() OVER (ORDER BY ORD_COL DESC) AS MYRANK
        FROM MYTABLE ) AS RANKED_TABLE
WHERE MYRANK<=N

2. 除了M1, M2两种TOP N外,还有一种被DB2称为 DENSE_RANK, (M3). 通过下例分别说明.
M1: TOP 3 -- 1(4,101), 2(5,101), 3(1, 100) 或者1(4,101), 2(5,101), 3(2, 100)
M2: TOP 3 -- 1(4,101), 1(5,101), 3(1, 100), 3(2, 100)
M3: TOP 3 -- 1(4,101), 1(5,101), 2(1, 100), 2(2, 100), 3(3,99)
在DB2中, M3如此实现:
SELECT * FROM
   (  SELECT MYKEY,DENSE_RANK() OVER (ORDER BY ORD_COL DESC) AS MYRANK
      FROM MYTABLE ) AS RANKED_TABLE
WHERE MYRANK<=N

3. 为避免DBMSs的方言问题, M2,M3可以有如下标准(SQL 92)表示:
M2:
SELECT * FROM MYTABLE M1 WHERE N>
   (   SELECT COUNT(*) FROM MYTABLE M2
       WHERE M2.ORD_COL>M1.ORD_COL);
注意: 两个比较符都是 >
M3:
SELECT * FROM MYTABLE M1 WHERE N>
   (   SELECT COUNT(DISTINCT M2.ORD_COL) FROM MYTABLE M2
       WHERE M2.ORD_COL>M1.ORD_COL);
注意: 与M2的不同在于DISTINCT的使用
至于M1, 我目前还没有想到合适的标准写法,请补充.

4. 关于MYSQL
相对于各主流RDBMS来说,MYSQL要简单,幼稚地多. 在运行MYSQL时发现居然不支持SUBQUERY. 因此MYSQL中的TOP N问题要复杂一些.
SELECT * FROM MYTABLE, MYTABLE M2
WHERE M2.ORD_COL>=M1.ORD_COL
GROUP BY M1.MYKEY
HAVING COUNT(M2.ORD_COL) <=N
但是,这个语句是有问题的. 一个极端的例子: 当所有的ORD_COL的数值都一样时. 如果哪位想到了如何解决这个问题,请补充.

----------------------------------------------------------------------------------
各语句已经测试过, 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/26/2000

时间: 2024-08-01 23:39:57

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

讨论: 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 问题

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