计算字段的WHERE子句不起作用

时间:2013-09-23 22:03:19

标签: sql ms-access

我有一个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)。我已经对每一行进行了一次点击,如果我可以避免它,那么就会有额外的开销。

3 个答案:

答案 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功能包含完整的公式。好处是有效,缺点是看起来稍微慢了一点。我感谢大家对此的帮助。谢谢。