如果我运行以下查询:
select B3.bid as id ,B3.bshape as shape
from Buildings B3
where B3.bid in
(
select distinct B1.bid from Buildings B1,
(
select * from Buildings B where B.bname in (select BOF.bname from Buildings_On_Fire BOF)
) B2 where sdo_nn(B1.bshape, B2.bshape, 'distance=100') = 'TRUE' and B1.bname != b2.bname
)
我收到以下错误:
第1行的错误:ORA-13249:如果没有,则无法评估SDO_NN 使用索引
ORA-06512:在“MDSYS.MD”,第1723行ORA-06512:at “MDSYS.MDERR”,第17行
ORA-06512:在“MDSYS.PRVT_IDX”,第9行
但是,如果只运行以下子查询:
select distinct B1.bid from Buildings B1,
(
select * from Buildings B where B.bname in (select BOF.bname from Buildings_On_Fire BOF)
) B2 where sdo_nn(B1.bshape, B2.bshape, 'distance=100') = 'TRUE' and B1.bname != b2.bname
执行得很好。我已经验证了空间索引,它们似乎是有效的
我是oracle的新手,不知道下一步该做什么。请帮忙。
如果有解决方案不需要更改上述查询,那将是最好的。
答案 0 :(得分:1)
答案有点迟,但是来了......
您得到的错误是因为优化器没有使用空间索引来解决SDO_NN运算符。与其他空间运算符(SDO_RELATE,SDO_WIHIN_DISTANCE)相反,如果没有索引的帮助,无法解析SDO_NN。
然后我再次怀疑你的查询是不正确的。如果我理解正确的话,你想要做的就是从所有着火的建筑物中找到所有距离100(什么?米?)的建筑物。为此,请使用SDO_WITHIN_DISTANCE运算符。
我们假设你的表是这样的:
建筑物(出价编号,bname varchar2(30),bshape sdo_geometry)
buildings_on_fire(出价编号,bname varchar2(30))
选择将如下:
select b1.bid as id, b1.bshape as shape
from buildings b1,
buildings b2,
buildings_on_fire bof
where b2.bname = bof.bname
and b1.bname <> b2.bname
and sdo_within_distance (
b1.bshape, b2.bshape,
'distance=100 unit=meter'
) = 'TRUE';