我有这么一张表pnbody,          BODYID                  PN
----------- -----------------------------------------------------           
          2         US2010289329   A1 20101118 DW201077
          3         DE102010014588    A1 20101118 DW201077
          4         DE102010017920    A1 20101118 DW201077
          4         US2010288367    A1 20101118 DW201077
          1         RU2404384        C2 20101120 DW201077
          2         JP2010268594    A  20101125 DW201077
这表就bodyid,pn两列, bodyid是外键,和pn列是一对多的关系,我想问的是:怎样才能保证之后我查出数据时,控制相同bodyid的pn的和我添加时的顺序一样,例如bodyid = 2;这列 查询select * from pnbody order by bodyid 结果这样:
          BODYID                PN
----------- --------------------------------------------------------------------------------
          1        RU2404384     C2 20101120 DW201077
          2        US2010289329  A1 20101118 DW201077
          2        FR2945685     A1 20101119 DW201077
          2        JP2010268594   20101125 DW201077
          3        DE102010014588 A1 20101118 DW201077

解决方案 »

  1.   

    ----加上rowid就可以了。
    select * from pnbody order by bodyid,rowid
      

  2.   


    在没有别的办法了吗?类似pnbody的 表有好几张了  
      

  3.   


    select * from pnbody order by bodyid,rowid
      

  4.   

    问题是你需要记录你插入时候的插入的顺序,要不你就必须修改表结构,在pnbody里加上个字段使用序列来自动分配,然后根据这个字段排序,使用rowid也应该不难吧。。
      

  5.   

    对于行迁移,用rowid排序是否会有问题??
      

  6.   

    用rowid是没法控制的.
    建议增加一列id,使用sequence构造自增列.来记录插入的顺序.
    之所以rowid不能用来标识插入顺序.
    比如一个extent由8个块组成.每个块可以存储30条数据(插入30条到达ptfree,删除10条,即20条记录时即可再插入记录).
    开始插入了240条记录,8个块全部用完,后来块3中的记录被删除20条,块被重用,新插入的10条记录被记录到块3,那么新插入的记录的rowid会比之前在块8中插入的记录的rowid还要小.
    另外,行迁移是不影响rowid的.行迁移的列需要两次io,第一次从rowid对应的位置读取真正的存储位置,第二次io才能取到记录.也就是说行迁移时,不是改变rowid,而是在原rowid对应的存储位置存储一个指向新位置的指针.
      

  7.   

    最好是加个 date 字段 默认插入sysdate 
      

  8.   

    谢谢大家了!表结构改了,加了pnid