Oracle Join View - какой rowid используется - PullRequest
1 голос
/ 16 июля 2010

CREATE VIEW EVENT_LOCATION ("EVENT_ID", "STREET", "TOWN") КАК ВЫБРАТЬ A.EVENT_ID, A.STREET, A.TOWN ИЗ TBLEVENTLOCATION ПРИСОЕДИНЯЙТЕСЬ К TBLEVENTS B ON A.EVENT_ID = B.EVENT_ID ГДЕ B.REGION= 'South';

если я запускаю

SELECT ROWID, STREET, TOWN FROM EVENT_LOCATION 

, то какой ROWID я должен вернуть?

Причина, по которой я спрашиваю: в базе данных многопросмотров с указанным выше «шаблоном».Похоже, что rowid возвращается из разных представлений.то есть.Я получаю как A.ROWID, так и B.ROWID ...

ОБНОВЛЕНИЕ: Я решил эту проблему, используя следующее представление.Что по существу гарантирует, что ROWID исходит из правильной таблицы.Спасибо за ваши ответы!

CREATE VIEW EVENT_LOCATION ("EVENT_ID", "STREET", "TOWN") AS
  SELECT A.EVENT_ID, A.STREET, A.TOWN
  FROM TBLEVENTLOCATION A
  WHERE A.EVENT_ID IN (SELECT EVENT_ID FROM TBLEVENTS WHERE REGION = 'South');

Ответы [ 2 ]

1 голос
/ 19 июля 2010

Попробуйте взглянуть на

select * from user_updatable_columns where table_name = 'EVENT_LOCATION'

В обновляемых столбцах должна указываться таблица (и, следовательно, идентификатор строки), которую Oracle считает дочерним.

Имейте в виду, что если выиспользуйте кластеры из нескольких таблиц (не часто, но возможно), тогда разные таблицы в одном кластере могут иметь записи с одинаковым ROWID.

Лично я бы порекомендовал (а) нигде не использовать ROWID в вашем коде и (б) если вы это сделаете, то включить в представление явный столбец evt.rowid evt_rowid.

1 голос
/ 16 июля 2010

Поскольку вы получаете ORA-01445 , если ни одна из таблиц, которые вы используете, сохраняет ключи, я думаю, что он вернет rowid одной из таблиц сохранения ключей.Я не знаю, что произойдет, если несколько таблиц сохранят ключи.

...