【问题标题】:Join tables on Oracle ROWID在 Oracle ROWID 上连接表
【发布时间】:2020-07-09 02:30:23
【问题描述】:

我在 Oracle 11g 中有 2 个表 A 和 B。表 B 包含与表 A 完全相同的数据,但多了一个 ROWID 列,即表 A 的 ROWID。

我将更改表 B 中 colx 列的值。然后通过将表 A 和表 B 与 ROWID 连接来更新表 A 中的 colx。

现在,ROWID 已编码。我应该将 ROWID 转换为 char 吗?当一个是列而另一个是Oracle ROWID伪列时,如何在表A和表B之间进行连接。

UPDATE tablea ta
   SET (colx) = (SELECT colx FROM tableb tb WHERE ta.rowid = tb.rowid)
 WHERE EXISTS (
    SELECT 1
      FROM tableb tb
     WHERE ta.rowid = tb.rowid )

【问题讨论】:

  • 您可能不想长时间存储 ROWID,因为它们是可能独立于逻辑数据而变化的物理数据。例如,如果有人在桌子上运行MOVE 来更改属性,则所有 ROWID 都会更改。

标签: sql oracle oracle11g


【解决方案1】:

现在,ROWID 已被编码。

您不使用标准的 oracle 类型 ROWID 吗?如果 - 是的,您不需要转换它。 例如,您的表 B 有 TAB_A_ROWID 列,其中包含表 A 中相关记录的 rowid。因此您可以轻松地加入它们:

select *
from A join B on B.TAB_A_ROWID = A.rowid

顺便说一句,在你的代码中我看到“ta.rowid = tb.rowid”

UPDATE tablea ta
  SET (colx) = (SELECT colx FROM tableb tb WHERE ta.rowid = tb.rowid)

但是rowid是伪列,不能添加列rowid。所以你指定了它们 - 真正的 rowid,而不是来自自己的列。

【讨论】:

    【解决方案2】:

    ROWID 是一个伪列,表示数据在数据块中的物理位置。它不是常量,不应用于任何参照完整性或连接。

    如果您更新分区键并且更新导致行移动 从一个分区到另一个 - rowid 会改变。

    如果你使用alter table t shrink space compact,rowid可能会改变

    如果你使用 alter table t move,rowid 可能会改变(即使没有 启用行移动)

    如果你使用闪回表 t to ....,rowid 可能会改变。

    ROWID 只能与真正的主键结合使用(如果有的话)。它不应该用作主键或代替真正的主键。

    https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:53140678334596

    【讨论】:

    • 这是一次性的。这可以实现吗?没有主键,因此取决于 ROWID
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多