Использование a exists с пространственным запросом в oracle приводит к ошибке

#oracle #oracle11g #geometry #spatial #oracle-spatial

#Oracle #oracle11g #геометрия #пространственный #oracle-spatial

Вопрос:

Я пытаюсь запросить все элементы, которые находятся на расстоянии 130 км друг от друга. Если я использую exists в части where, я получаю исключение:

Это работает нормально:

 select *
from tbl_geometry g1, tbl_geometry g2
where sdo_within_distance(g1.GEOMETRY, g2.GEOMETRY, 'distance=130 unit=km')='TRUE'
and g1.id <> g2.id;
  

Здесь я получаю исключение:

 select *
from tbl_geometry g1
where exists(
    select *
    from tbl_geometry g3
    where g1.id <> g3.id
    and sdo_within_distance(g1.GEOMETRY, g3.GEOMETRY, 'distance=130 unit=km') = 'TRUE'
);
  

Ошибка:
[72000][13226] ORA-13226: интерфейс не поддерживается без пространственного индекса ORA-06512: at «MDSYS.MD «, строка 1723 ORA-06512: в «MDSYS.MDERR», строка 8 ORA-06512: в «MDSYS.SDO_3GL», строка 1052

Добавление другого экземпляра tbl_geometry «решает» проблему:

 select *
from tbl_geometry g1
where exists(
    select *
    from tbl_geometry g2, tbl_geometry g3
    where g2.id = g1.id
    and g2.id <> g3.id
    and sdo_within_distance(g2.GEOMETRY, g3.GEOMETRY, 'distance=130 unit=km') = 'TRUE'
    );
  

Любая идея, как я могу использовать exists без наличия 2 tbl_geometry там без причины.

Спасибо.

Ответ №1:

Хотите увидеть немного магии?

Ваш запрос:

 SQL> SELECT COUNT(*)
  2    FROM tbl_geometry g1
  3   WHERE EXISTS
  4            (SELECT *
  5               FROM tbl_geometry g3
  6              WHERE     g1.id <> g3.id
  7                    AND sdo_within_distance (g1.geometry,
  8                                             g3.geometry,
  9                                             'distance=130 unit=km') = 'TRUE');
SELECT COUNT(*)
*
ERROR at line 1:
ORA-13226: interface not supported without a spatial index
ORA-06512: at "MDSYS.MD", line 1723
ORA-06512: at "MDSYS.MDERR", line 8
ORA-06512: at "MDSYS.SDO_3GL", line 1082
  

Мой запрос:

 SQL> SELECT COUNT(*)
  2    FROM tbl_geometry g1
  3   WHERE EXISTS
  4            (SELECT *
  5               FROM tbl_geometry g3
  6              WHERE     g1.id <> g3.id
  7                    AND sdo_within_distance (g3.geometry,
  8                                             g1.geometry,
  9                                             'distance=130 unit=km') = 'TRUE');

  COUNT(*)
----------
       815

SQL>
  

Можете ли вы заметить разницу? Нет? Вот оно:

   7                    AND sdo_within_distance (g1.geometry,    --> g1
  8                                             g3.geometry,    --> g3
  9                                             'distance=130 unit=km') = 'TRUE');
  

против.

   7                    AND sdo_within_distance (g3.geometry,    --> g3
  8                                             g1.geometry,    --> g1
  9                                             'distance=130 unit=km') = 'TRUE');
  

Почему? Я ПОНЯТИЯ не имею. Но это работает.

Комментарии:

1. Хаххаах! Спасибо, но, боюсь, нет 🙂