不使用索引就无法评估SD0_NN

时间:2015-04-12 01:59:12

标签: sql oracle oracle11g oracle-spatial

我知道这是一个经常被讨论的错误,但即使在努力尝试之后我也无法完成它。

我有以下查询可以正常使用

SELECT b.BID
FROM STUDENT s,
     BUILDINGS b
WHERE sdo_nn(b.LOC, s.LOC, 'sdo_num_res=1', 1) = 'TRUE'

并显示每个s的最近邻居。但我想要的是显示出现最多的前2 b 的BID,因此我将查询更改为:

SELECT b.BID, count(b.BID)
FROM STUDENT s,
     BUILDINGS b
WHERE sdo_nn(b.LOC, s.LOC, 'sdo_num_res=1', 1) = 'TRUE'
GROUP BY b.BID

然后失败并显示错误如果不使用索引则无法评估SDO_NN。

请你帮忙解决这个问题,或者告诉我另一种方法。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用子查询:

SELECT BID, COUNT(*)
FROM (SELECT b.BID
      FROM STUDENT s,
           BUILDINGS b
      WHERE sdo_nn(b.LOC, s.LOC, 'sdo_num_res=1', 1) = 'TRUE'
     ) b
GROUP BY BID;

我不确定为什么需要子查询,但如果第一个查询有效,那么这个也应该。

注意:我倾向于使用明确的join来写这个(因为我在from子句中憎恶逗号):

SELECT BID, COUNT(*)
FROM (SELECT b.BID
      FROM STUDENT s JOIN
           BUILDINGS b
           ON sdo_nn(b.LOC, s.LOC, 'sdo_num_res=1', 1) = 'TRUE'
     ) b
GROUP BY BID;