高分求高人讨论:oracle 取排完序后记录集的前N条记录解决办法
高分求高人讨论: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.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,这个肯定是唯一的
效率高的办法没有。
------解决方案--------------------
楼上测试的除非是主键,否则是错误的。
------解决方案--------------------
------解决方案--------------------
在数据库里面写存储过程,程序里面调用