Oracle Spatial Index в представлении нескольких таблиц

У меня есть три большие таблицы с одинаковой структурой (BATHY_SHC_1, BATHY_SHC_2 and BATHY_SHC_3), каждая со столбцом SDO_GEOMETRY «POINT_PP», пространственный индекс каждого из них ДЕЙСТВИТЕЛЬНЫЙ. Я сделал представление этих таблиц, которое включает этот столбец геометрии (V_BATHY_SHC). Я могу сделать пространственный запрос в представлении, чтобы найти все точки внутри прямоугольника с правильными результатами:

SELECT PT_ID, POINT_PP from V_BATHY_SHC
WHERE SDO_RELATE(POINT_PP, MDSYS.SDO_GEOMETRY(2003, 32618, null, MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),MDSYS.SDO_ORDINATE_ARRAY(635267,5037808, 635277,5037818)), 'mask=anyinteract') = 'TRUE';

Я загрузил полигон MASK в таблицу MNE_MASK, добавил строку в метаданные и создал пространственный индекс (как обычно). Он имеет допустимый пространственный индекс. Геометрия находится в том же SRID (32618). Затем я хочу получить все точки вида, которые находятся внутри полигона из таблицы MNE_MASK. Если я сделал запрос к одной из таблиц, я получаю правильные результаты:

SELECT A.PT_ID, A.POINT_PP
FROM BATHY_SHC_1 A, MNE_MASK B
WHERE B.MNE_ID = 1
AND SDO_RELATE(A.POINT_PP, B.MASK, 'mask=ANYINTERACT ') = 'TRUE';

Но если бы я сделал это на представлении следующим образом:

SELECT A.PT_ID, A.POINT_PP
FROM V_BATHY_SHC A, MNE_MASK B
WHERE B.MNE_ID = 1
AND SDO_RELATE(A.POINT_PP, B.MASK, 'mask=ANYINTERACT ') = 'TRUE';

Я получил эту ошибку:

ORA-13226: интерфейс не поддерживается без пространственного индекса ORA-06512: в "MDSYS.MD", строка 1723 ORA-06512: в "MDSYS.MDERR", строка 8 ORA-06512: в "MDSYS.SDO_3GL", строка 94

В прошлом я всегда без проблем выполнял запросы к пространственному индексу представлений нескольких таблиц.
Я могу без проблем выполнить пространственный запрос к обеим таблицам, но не могу установить SDO_RELATE между ними… Почему это отличается ? Большое спасибо за понимание и помощь!

Изменить: я нашел быстрое обходное решение, но это не объясняет, почему. Если я поменяю местами два первых параметра в функции SDO_RELATE, запрос сработает.

SELECT A.PT_ID, A.POINT_PP
FROM V_BATHY_SHC A, MNE_MASK B
WHERE B.MNE_ID = 1
AND SDO_RELATE(B.MASK, A.POINT_PP, 'mask=ANYINTERACT ') = 'TRUE';

person Akarius    schedule 23.11.2018    source источник
comment
Аналогичная (не устраненная) проблема на форуме сообщества Oracle ссылка. Это может быть ошибка, и оракул, похоже, не удосуживается ее исправить, поскольку это не влияет на многих людей.   -  person Akarius    schedule 26.11.2018


Ответы (1)


В SDO_RELATE первый параметр — это столбец геометрии в таблице, а второй — отдельная геометрия. При этом мне интересно, почему ваш исходный запрос работает. Там у вас есть столбец представления в качестве первого параметра, как и в неудачном запросе.

person JvdLinden    schedule 09.12.2018
comment
Это работает, потому что таблица MNE_MASK имеет только 1 результат, где B.MNE_ID = 1, поэтому второй параметр — это одна геометрия. (многоугольник) - person Akarius; 10.12.2018