Быстрое обновление материализованных представлений с виртуальными столбцами

Я хотел материализованное представление с быстрым обновлением (обновление содержащихся в таблицах обновлений). Запрос на материализованное представление выглядит примерно так:

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, например

    ИМЯ NVARCHAR2 (4000) ВСЕГДА СОЗДАВАЕТСЯ КАК ("СХЕМА". "GET_NAME_FROM_OTHER_TABLE" ("ID"))

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

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

а также

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

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


person mehrandvd    schedule 28.01.2014    source источник
comment
функция, использующая данные из другой таблицы, не может быть детерминированной - тогда нет.   -  person haki    schedule 28.01.2014
comment
stackoverflow.com/questions/7505020/ может помочь.   -  person Frank Schmitt    schedule 28.01.2014


Ответы (1)


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

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, чтобы получить правильный тип данных в первом запросе.

person Wernfried Domscheit    schedule 28.01.2014