Я использую Oracle 11g, и у меня есть три таблицы, а именно, TABLE_1
, TABLE_2
, TABLE_3
. В операторе выбора мне нужно выполнить следующий запрос:
SELECT
-- // ommitted
FROM
TABLE_1,
TABLE_2,
TABLE_3
WHERE
-- // ommitted
AND NVL(TABLE_1.COL_1, 0) = NVL(TABLE_2.COL, 0)
AND (TABLE_1.COL_2 = TABLE_3.COL OR NVL(TABLE_1.COL_2, 0) = 0)
Я хочу создать растровый индекс на основе функций для следующих элементов:
NVL(TABLE_1.COL_1, 0) = NVL(TABLE_2.COL, 0)
(TABLE_1.COL_2 = TABLE_3.COL OR NVL(TABLE_1.COL_2, 0) = 0)
Возможно ли это?
Для NVL(TABLE_1.COL_1, 0) = NVL(TABLE_2.COL, 0)
Я пробовал:
CREATE BITMAP INDEX TABLE_1_TABLE_2_NVL_COL_IDX
ON TABLE_1 (TABLE_2.COL)
FROM TABLE_1, TABLE_2
WHERE NVL(TABLE_1.COL_1, 0) = NVL(TABLE_2.COL, 0);
Но выдало ошибку:
ORA-25954: missing primary key or unique constraint on dimension
25954. 00000 - "missing primary key or unique constraint on dimension\n"
*Cause: An attempt to create a join index was made, which failed
because one or more dimensions did not have an appropriate
constraint matching the join conditions.
*Action: Ensure that the where clause is correct (contains all of the
constraint columns) and that an enforced constraint is on
each dimension table.
Если я смогу создать индексы, то будет ли следующий синтаксис правильным способом давать подсказки в операторе select?:
SELECT
/*+ INDEX (TABLE_1 TABLE_1_TABLE_2_NVL_COL_IDX) */
/*+ INDEX (TABLE_1 TABLE_1_TABLE_3_NVL_COL_IDX) */
-- // ommitted