目前考虑有如下几种方式及相应问题:
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.   

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

  2.   

    没有主键ADO怎么去定位要更新的记录?
    还是添加主键吧?可以用 sequence 生成主键值
      

  3.   

    有没更合适的“取排完序后记录集的前N条记录的SQL语句”?
      

  4.   

    1。oracle不同于sql server的地方,确实是只取10条记录后排序。 
    2。可以取rowid,这个肯定是唯一的 效率高的办法没有。
      

  5.   

    select * from AGIPERSONHIST WHERE ROWNUM<10 ORDER BY AP_AGID 
    我测试了,是可以的
      

  6.   

    rownum 似乎是在order by之前生成的
    可以比较
    select AGIPERSONHIST.* rownum from AGIPERSONHIST  ORDER BY AP_AGID  asc 和
    select AGIPERSONHIST.* rownum from AGIPERSONHIST  ORDER BY AP_AGID  desc可以使用
    select AGIPERSONHIST.* from (select rownum as num from AGIPERSONHIST) t where t.num <= 10;
      

  7.   

    这是对的。
    此外,需要注意的是,你的查询语句需要改为:
    select * from (select t.*, t.rowid from tbname t order by FldName) where rownum <=10
    这样,你的结果集里就有ROWID了,在Oracle里,ROWID是唯一的,比主键还快!