很简单的 SQL SERVER --->ORACLE 时候的 TOP N 问题(100分)

W

wsn

Unregistered / Unconfirmed
GUEST, unregistred user!
这是一段sql语句,在sqlserver里可以执行,但是移植到oracle的是时候top N 问题我总也处理不好
刚刚接触oracle,还望大虾们指点
========================================================
select top 20 AnnounceID,parentID,boardID,UserName,child,Topic,DateAndTime,hits,RootID,locktopic,istop,isbest,isvote,LastPost
from bbs1
where boardID=3 and parentID=0 and istop=0 and times < all
(select top 20 times
from bbs1
where boardID=3 and istop=0 and parentID=0 order by times desc)
and not locktopic=2 ORDER BY istop desc,times desc,announceid desc
 
呵呵,Oracle不支持Top XX的说,你可以利用它的内置RowNum属性和
子查询来实现类似的功能
如:
Select * from
(Select RowNum,r.* from YourTable r order By XXXX) //排序条件
where RowNum <= YYY //取头YYY条记录
 
to :杜宝
在这条语句中
(Select RowNum,r.* from YourTable r order By XXXX) //排序条件

也是要用rownum设定返回20条的呀,它和外层的rownum不会起冲突吗?

 
如果有字段也叫这个名字,就用限定符了。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=895861
 
呵呵,不会的。你看这个查询:
Select * from
(Select RowNum as ID1 , t.* from
(select RowNum as ID2 , r.* from MemRole r order by r.F_No desc) t
where RowNum <= 5)
where rowNum <= 2

是取MemRole表的最后五条中的头两条,可以运行并正确返回。
RowNum这个属性,Oracle每次Select产生成结果集时都会自动
生成,以上面的例子,在内层中生成一个,外层中又生成一个。

你也可以不写RowNum直接引用,如:
Select * from
(Select * from
(select * from MemRole r order by r.F_No desc)
where RowNum <= 5)
where rowNum <= 2
也是一样的。还有就是象上面一样的加一个别名也行。
 
Select * from
(Select * from
(select * from MemRole r order by r.F_No desc) '--如果数据量比较大的时候这条语句返回的条目数好像就太大了呀
'我的想法是先用这句来控制一下返回的记录条数
where RowNum <= 5)
where rowNum <= 2
 
去年《程序员》第九期上有篇文章提到用 rank 来解决,我在想想看吧
 

用Oracle的保留字 rownum 及子查询吧。
 
谢谢大家帮助
结束 [:)]
 
顶部