我正在创建一个应用程序,可以发现建筑物的邻近建筑物/消防栓着火。我创建了表格:
CREATE TABLE building (
buildingno VARCHAR(40) PRIMARY KEY
, buildingname VARCHAR2(32),noofvertices INT
, shape MDSYS.SDO_GEOMETRY)
和
CREATE TABLE hydrant (hydrantno VARCHAR(40) PRIMARY KEY
, point MDSYS.SDO_GEOMETRY)
和
CREATE TABLE firebuilding(hydrantno VARCHAR(40) PRIMARY KEY)
我想找到特定建筑物的最近邻居(消防栓和建筑物)。我可以在不创建列名称空间索引的情况下执行此操作吗?
我正在学习空间查询,我正在处理的数据集很小(每个表中大约有20个条目,不会增长)。
答案 0 :(得分:1)
你有充分的理由不创建空间索引吗?
如果你这样做,并且如果形状的数量很小,你可以使用“强力”方法获得可接受的结果和性能,该方法使用SDO_GEOM.SDO_DISTANCE
来计算给定点与其他每个点之间的距离点数然后选择最小距离。例如,如果firebuilding
标识给定建筑物,则以下查询使用1米的公差(如果坐标为大地测量)或1个坐标单位(如果坐标为非大地测量)标识最近的建筑物:
SELECT
B.*
FROM
(
SELECT
A.*,
DENSE_RANK () OVER (ORDER BY A.DISTANCE) AS RANKING
FROM
(
SELECT
OTHER_BUILDINGS.*,
SDO_GEOM.SDO_DISTANCE(BUILDING.SHAPE, OTHER_BUILDINGS.SHAPE, 1) DISTANCE
FROM
FIREBUILDING,
BUILDING,
BUILDING OTHER_BUILDINGS
WHERE
BUILDING.BUILDINGNO = FIREBUILDING.BUILDINGNO
AND
OTHER_BUILDINGS.BUILDINGNO <> BUILDING.BUILDINGNO
) A
) B
WHERE
B.RANKING = 1;