0

我很难将我的 sybase 脚本转换为 Oracle 11g 脚本。我使用了翻译工具,但我对 Rowid 更加困惑。有没有更简单的方法可以在不使用 rowid 的情况下做到这一点,这样对于刚学习 Oracle 的我来说更容易消化?

这是我的 Sybase 脚本:

delete table_1       
    from table_1 a, table_2 b     
    where (select count(*) from table_2       
                where a.id = id       
                    and a.seq = seq       
                    and a.gcode = gcode       
                    and a.gtype = gtype) = 0       
    and a.id = b.id    
    and a.seq = b.seq;   

以下是 Oracle SQL 开发翻译工具的结果:

 DELETE table_1
   WHERE ROWID IN 
   ( SELECT a.ROWID
     FROM table_1 a,
          table_2 b
    WHERE ( SELECT COUNT(*) 
            FROM table_2 
             WHERE a.id = id
                  AND a.seq = seq
                  AND a.gcode = gcode
                  AND a.gtype = gtype ) = 0
         AND a.id = b.id
         AND a.seq = b.seq );  

使用 ID 而不是 RowId 写入是否安全?: table_1 和 table_2 中的 ID 引用相同的 PK。Table_1 和 table_2 是彼此的镜像。

 DELETE table_1
   WHERE ID IN 
   ( SELECT DISTINCT a.ID
     FROM table_1 a,
          table_2 b
    WHERE ( SELECT COUNT(*) 
            FROM table_2 
             WHERE a.id = id
                  AND a.seq = seq
                  AND a.gcode = gcode
                  AND a.gtype = gtype ) = 0
         AND a.id = b.id
         AND a.seq = b.seq );  
4

2 回答 2

0

Rowid 标识一行。两行不能有相同的rowid。如果表中的 id 是主键(如果是复合键则不是部分),那么您基本上可以通过使用 id 来实现相同的目的。然而,rowid 通常提供更快的访问,因为它引用行的物理位置并且不必使用索引来访问该行。

于 2012-08-08T06:48:22.757 回答
0

小心分区。不同分区上可以有相同的rowid,所以上面关于rowid唯一性的说法对分区表无效

于 2013-07-17T12:13:51.783 回答