1

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

我有以下查询可以正常工作

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 无法在不使用 index 的情况下进行评估

你能帮我解决这个问题或告诉我另一种方法吗?

4

1 回答 1

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;
于 2015-04-12T02:01:22.077 回答