#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. Хаххаах! Спасибо, но, боюсь, нет 🙂