1

我有一个 Access SQL 查询从纬度和经度输入(类似于商店定位器)中提取结果。在我尝试放入 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)。我已经对每一行进行了一次点击,如果可以避免的话,额外的开销会很大。

4

3 回答 3

0

您输入它的方式受到 B.distCalc 的限制,这需要计算 A.distCalc,您要求对其进行排序。即使这有效,也需要 n^2 计算来计算。

尝试在内部查询中将过滤器放在 distCalc 上(使用 distCalc 的公式,而不是 distCalc 本身)。

于 2013-09-23T22:15:12.067 回答
0

我能够通过将复杂的公式推入函数然后返回值(然后可以在 WHERE 子句中使用)来“解决”问题。

代替:

    3959 * ArcCOS( cosRadSelLAT * cosRadSimsLAT * cos(radSimsLONG - radSelLONG) + sinRadSelLAT * sinRadSimsLAT) AS distCalc  

我去了:

    ArcCOS2(cosRadSelLAT,cosRadSimsLAT,radSimsLONG, radSelLONG,sinRadSelLAT,sinRadSimsLAT) AS distCalc

ArcCOS2 函数包含完整的公式。好处是它有效,坏处是它似乎有点慢。我感谢大家对此的帮助。谢谢你。

于 2013-09-24T14:26:43.747 回答
0

这不是一个答案。这是一个格式化的评论。当你这样做时会发生什么:

select *
from (
select somefield, count(*) records
from sometable
group by somefield) temp

如果运行成功,请尝试使用

where records > 0

在最后。如果失败,您可能需要另一种方法。如果成功,请使用这样的小步骤开始构建您的真实查询。尽早测试并经常测试。

于 2013-09-24T00:04:38.370 回答