【问题标题】:Join Delete in Oracle 11g在 Oracle 11g 中加入删除
【发布时间】:2012-08-07 14:53:47
【问题描述】:

我很难将我的 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 );  

【问题讨论】:

    标签: oracle11g


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多