我有一个Access SQL查询从Latitude& amp;经度输入(类似于商店定位器)。它完全正常,直到我尝试输入一个WHERE子句,将结果限制为仅在XXX英里内的结果(在我的情况下为3)。
以下查询在没有添加WHERE distCalc < 3
子句的情况下正常工作:
PARAMETERS
[selNum] Long
, [selCBSA] Long
, [cosRadSelLAT] IEEEDouble
, [radSelLONG] IEEEDouble
, [sinRadSelLAT] IEEEDouble;
SELECT B.* FROM (
SELECT A.* FROM (
SELECT
CERT
, RSSDHCR
, NAMEFULL
, BRNUM
, NAMEBR
, ADDRESBR
, CITYBR
, STALPBR
, ZIPBR
, simsLAT
, simsLONG
, DEPDOM
, DEPSUMBR
, 3959 * ArcCOS(
cosRadSelLAT
* cosRadSimsLAT
* cos(radSimsLONG - radSelLONG)
+ sinRadSelLAT
* sinRadSimsLAT
) AS distCalc
FROM aBRc
WHERE CBSA = selCBSA
AND cosRadSimsLAT IS NOT NULL
AND UNINUMBR <> selNum
) AS A
ORDER BY distCalc
) AS B
WHERE B.distCalc < 3
ORDER BY B.DEPSUMBR DESC;
当我添加WHERE distCalc < 3
子句时,我得到了可怕的
此表达式输入错误,或者太复杂而无法评估。
错误。
鉴于该值是在A子查询中创建的,我认为它可以在外部B查询中用于比较计算。我可以重新计算distCalc
中的WHERE
,但是,我正在尝试避免这种情况,因为我使用的是自定义函数(ArcCOS
)。我已经对每一行进行了一次点击,如果我可以避免它,那么就会有额外的开销。
答案 0 :(得分:0)
你键入它的方式是限制它B.distCalc,这需要计算A.distCalc,你要求它排序。即使这项工作有效,也需要n ^ 2次计算来计算。
尝试在内部查询中将过滤器放在distCalc上(使用distCalc的公式,而不是distCalc本身)。
答案 1 :(得分:0)
这不是答案。这是一个格式化的评论。当你这样做时会发生什么:
select *
from (
select somefield, count(*) records
from sometable
group by somefield) temp
如果成功运行,请尝试
where records > 0
最后。如果失败,您可能需要另一种方法。如果成功,请使用这样的婴儿步骤开始构建您的真实查询。尽早测试并经常测试。
答案 2 :(得分:0)
我能够通过将复杂的公式推入函数然后返回值(然后可以在WHERE子句中使用)来“解决”问题。
而不是:
3959 * ArcCOS( cosRadSelLAT * cosRadSimsLAT * cos(radSimsLONG - radSelLONG) + sinRadSelLAT * sinRadSimsLAT) AS distCalc
我去了:
ArcCOS2(cosRadSelLAT,cosRadSimsLAT,radSimsLONG, radSelLONG,sinRadSelLAT,sinRadSimsLAT) AS distCalc
ArcCOS2功能包含完整的公式。好处是有效,缺点是看起来稍微慢了一点。我感谢大家对此的帮助。谢谢。