2014-01-28 2 views
2

Мне нужен материализованный просмотр с быстрым обновлением (обновление обновленного содержимого таблиц). Материализованного вида запрос что-то вроде:Быстрое обновление на материализованных представлениях с виртуальными столбцами

SELECT T1.CODE, T2.NAME 
FROM T1 

UNION ALL 

SELECT T2.CODE, T3.NAME 
FROM T2, T3 
WHERE T2.ID = T3.ID 

Оказывается, что в случае использования UNION ALL я должен добавить ROWID добиться быстрого обновления.

Добавление ROWID одобрено для первой части, но для второй части оно не может быть добавлено, так как оно имеет соединение.

Кажется, есть 2 варианта преодоления этого:

  1. Добавление избыточную колонку для NAME на T2 и удалить T3 из запроса.
  2. Добавление виртуальной колонки, содержащей функцию, которая выбирает название от T3 как

    NAME NVARCHAR2 (4000), генерируемый ВСЕГДА КАК ("схема". "GET_NAME_FROM_OTHER_TABLE" ("ID"))

по этой ссылке: http://www.oracle-base.com/articles/11g/virtual-columns-11gr1.php он говорит:

материализованные представления, которые имеют доступ к виртуальным колонкам должны быть полностью обновлены.

и

Если это относится к детерминированной функции, определенной пользователем, он не может быть использован в качестве столбца ключа разделения.

Могу ли я по-прежнему иметь опцию быстрого обновления на материализованном виде с использованием решения 2?

+1

Функция, которая использует данные из другой таблицы, не может быть детерминированной - тогда нет. – haki

+0

http://stackoverflow.com/questions/7505020/oracle-how-to-create-a-materialized-view-with-fast-refresh-and-joins может помочь. –

ответ

0

Это работает?

SELECT T1.CODE, T2.NAME, T1.ROWID as ROWID_T1, NULL as ROWID_T2, NULL as ROWID_T3 
FROM T1 

UNION ALL 

SELECT T2.CODE, T3.NAME, NULL as ROWID_T1, T2.ROWID as ROWID_T2, T3.ROWID as ROWID_T3 
FROM T2, T3 
WHERE T2.ID = T3.ID 

Может быть, вы должны использовать CAST(NULL AS ROWID) AS ROWID_T2 для того, чтобы получить соответствующий тип данных в первом запросе.

Смежные вопросы