2012-08-07 70 views
0

我很难将sybase脚本转换为Oracle 11g脚本。我使用了翻译工具,但我对Rowid更加混淆。 有没有更简单的方法做到这一点,而不使用rowid,因此对于我来说,只要学习Oracle就能更容易消化?加入Oracle 11g中的删除

这里是我的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); 

回答

0

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

0

小心分区。在不同的分区上可以有相同的rowid,因此上述有关rowid的uniqnuness的声明对分区表无效