日期:2014-05-17  浏览次数:20810 次

高分求高人讨论:oracle 取排完序后记录集的前N条记录
目前考虑有如下几种方式及相应问题:
1.select * from tbname where rownum<=10 order by FldName
存在问题:获得的记录并不是排完序后的前10条记录。怀疑是先取的10条,然后对这10条进行的排序。
2.select * from (select * from tbname order by FldName) where rownum<=10
存在问题:用些方式获得的记录集能满足我的要求。
但是却不能通过ADO对该记录结果进行编辑,C++ BUILDER代码如下:
  ADOQry->Edit();
  ADOQry->FieldByName("STATE")->AsString = "1";
  ADOQry->Post();//执行此处失败

目前想到的解决方式:1.用2中的SQL语句获得记录集,然后取该记录集中的主健,用主健做该记录的更新操作:
  更新方式:(1).SQL语句“UPDATE tbname set STATE='1' where keyfld=keywords”
  (2).重新获得记录集:select * from tbname where keyfld=keywords,
  然后:
  ADOQry->Edit();
  ADOQry->FieldByName("STATE")->AsString = "1";
  ADOQry->Post();
存在问题:需要有主键
求:1.其他“效率高”的解决方式。
  2.我所列的解决方式,如果没有主键该怎么做?


------解决方案--------------------
1。你的怀疑是对的
2。做法是对的。
可以取rowid,这个肯定是唯一的

------解决方案--------------------
没有主键ADO怎么去定位要更新的记录?
还是添加主键吧?可以用 sequence 生成主键值
------解决方案--------------------
选出Rowid
------解决方案--------------------
1。oracle不同于sql server的地方,确实是只取10条记录后排序。 
2。可以取rowid,这个肯定是唯一的 

效率高的办法没有。

------解决方案--------------------
楼上测试的除非是主键,否则是错误的。
------解决方案--------------------
探讨
1。你的怀疑是对的
2。做法是对的。
可以取rowid,这个肯定是唯一的

------解决方案--------------------
在数据库里面写存储过程,程序里面调用