2013-09-23 3 views
1

У меня есть запрос SQL Access, возвращающий результаты с Latitude & Долгота долготы (аналогично локатору магазина). Он отлично работает, пока я не попытаюсь включить предложение WHERE, ограничивающее результаты только результирующими в течение XXX миль (3 в моем случае).Предложение WHERE на вычисленном поле не работает

Следующий запрос отлично работает без пункта 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, я получаю страшный

Это выражение набран неверно, или это слишком сложный для оценки.

погрешность.

Учитывая, что значение создается в подзапросе А, я думал, что он будет доступен во внешнем B-запросе для сравнительных вычислений. Я мог бы пересчитать distCalc в WHERE, однако я стараюсь избегать этого, так как я использую настраиваемую функцию (ArcCOS). Я уже делаю один удар по каждой строке, и есть значительные накладные расходы, связанные с дополнительными, если я могу избежать этого.

+1

Попробуйте переместить предложение where where вправо после первой производной таблицы. Кроме того, ваш первый порядок заказа является избыточным. –

+0

Что вы на самом деле пытаетесь сделать? – Bohemian

+0

Предложение первого порядка - это удержание, когда я делал притяжение Top 20. Хотя на самом деле нет необходимости в этом вопросе, я не думаю, что это вызывает проблему. Перед написанием сообщения я попробовал предложение WHERE distCalc <3 в первом запросе и имел тот же результат.Я просто проверил его снова и удалил внешний запрос и имел ту же «слишком сложную» ошибку. Чтобы ответить на второй вопрос - я пытаюсь вытащить записи, которые находятся в пределах 3 миль (вычисленных в методе distCalc) переданных параметров. –

ответ

0

Как вы его набрали, вы ограничиваете его B.distCalc, который требует вычисления A.distCalc, на который вы запрашиваете сортировку. Даже если бы это сработало, потребовалось бы вычисление n^2.

Попробуйте поместить фильтр в distCalc во внутренний запрос (используя формулу для distCalc, а не distCalc).

+1

Нет абсолютно никакой причины, почему для этого потребовались бы вычисления n^2. Я признаю, что возможно, что Access реализует это плохо, я действительно не знаю, но у других систем баз данных не было бы проблем с этим. – hvd

+0

Я ценю быстрый ответ. Да, я мог бы это сделать, но мне нужно значение distCalc, поэтому я вернусь к двум вычислениям. Если я удалю WHERE distCalc <3 и ORDER BY DEPSUMBR DESC и заменим его ORDER BY distCalc DESC, он будет работать. Поэтому я могу сортировать результат вычисления по внешнему запросу, но не может фильтровать (используя WHERE) - этого я не понимаю. –

0

Это не ответ. Это форматированный комментарий. Что происходит, когда вы делаете это:

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

Если выполняется успешно, попробуйте с

where records > 0 

в конце. Если это не удается, вам, вероятно, нужен другой подход. Если это удастся, начните создавать свой реальный запрос, используя детские шаги, подобные этому. Испытайте заранее и часто проверяйте.

0

Я смог «решить» проблему, нажав сложную формулу в функцию и затем вернув значение (которое затем можно было использовать в предложении WHERE).

Вместо:

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

Я пошел с:

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

ArcCOS2 Функция содержала полную формулу. Положительная сторона - это работает, недостаток - это, по-видимому, немного медленнее. Я ценю всю помощь в этом. Спасибо.

Смежные вопросы