Объединение таблиц на Oracle ROWID - PullRequest
0 голосов
/ 09 июля 2020

У меня есть 2 таблицы A и B в Oracle 11g. Таблица B содержит те же данные, что и таблица A, но с дополнительным столбцом ROWID, который является ROWID таблицы A.

Я собираюсь изменить значения столбца, например, colx в таблице B. И затем обновить colx в таблице A путем объединения таблицы A и таблицы B с ROWID.

Теперь ROWID закодирован. Должен ли я преобразовать ROWID в char? Как выполнить соединение между таблицей A и таблицей B, если одна из них является столбцом, а другая - псевдоколонкой Oracle ROWID.

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 )

Ответы [ 2 ]

1 голос
/ 09 июля 2020

ROWID - это псевдостолбец, представляющий физическое расположение данных в блоке данных. Он НЕ является константой и не должен использоваться для какой-либо ссылочной целостности или объединений.

если вы обновляете ключ раздела, и обновление приводит к перемещению строки из одного раздела в другой - идентификатор строки будет ИЗМЕНИТЬСЯ .

Если вы используете alter table t shrink space compact, идентификатор строки может измениться

Если вы используете alter table t move, идентификатор строки может измениться (даже без включения перемещения строки)

Если вы используете flashback table t to ...., rowid может измениться.

ROWID следует использовать - если вообще возможно - в сочетании с истинным первичным ключом. Никогда не следует использовать как первичный ключ или вместо истинного первичного ключа.

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

1 голос
/ 09 июля 2020

Теперь ROWID закодирован.

Разве вы не используете стандартный oracle тип ROWID? Если - да, конвертировать не нужно. Например, ваша таблица B имеет столбец TAB_A_ROWID, который содержит rowid связанной записи в таблице A. Так что вы можете легко присоединиться к ним:

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

Btw, в вашем коде я вижу "ta.rowid = tb.rowid "

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

, но rowid является псевдоколонкой, вы не можете добавить rowid столбца. поэтому вы указали их оба - реальные идентификаторы строк, а не из собственного столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...