【问题标题】:SD0_NNcannot be evaluated without using index不使用索引无法评估 SD0_NN
【发布时间】:2015-06-17 13:43:32
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么你有mysqloracle 标签?您使用的是哪个 RDBMS?
  • 我错了,我用的是ORACLE

标签: sql oracle oracle11g oracle-spatial


【解决方案1】:

您可以尝试使用子查询:

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;

【讨论】:

  • 仍然给出完全相同的错误。我还在元数据中添加了两个 LOC
  • 是否有另一种方法可以使用 sdo_nn 命令找到最接近大多数 S 的前两个 B?
猜你喜欢
  • 2022-01-12
  • 2019-05-10
  • 2011-05-15
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 2012-09-16
  • 2017-04-26
  • 2016-09-28
相关资源
最近更新 更多