我知道这是一个经常被讨论的错误,但即使在努力尝试之后我也无法完成它。
我有以下查询可以正常使用
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。
请你帮忙解决这个问题,或者告诉我另一种方法。
答案 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;