2013-06-27 4 views
0

Я написал функцию для вычисления расстояния между 2 точками с учетом максимального радиуса. Функция работает, но ее нужно вызвать дважды, так как я ее реализовал:Оптимизация запроса функции расстояния - SQL Server 2005

Как только вы выберите блок, а затем снова в блоке where.

Есть ли лучший способ достичь этого?

Спасибо за помощь!

select 
    c.LABEL_NAME, 
    k.*, 
    dbo.kiw_GetNearMeetingLocationInMiles_FUNC(41.056466,-85.3312009,LATITUDE,LONGITUDE) as distance 
    from USR_KIW_CUS_MEETING as k 
    join CUSTOMER as c 
    on c.MASTER_CUSTOMER_ID = k.MASTER_CUSTOMER_ID 
    where c.USR_MEMBERSHIP_STATUS_CODE NOT IN('CR','CSD') 
    and dbo.kiw_GetNearMeetingLocationInMiles_FUNC(41.056466,-85.3312009,LATITUDE,LONGITUDE) <= 120; 

UPDATE

Это работает, на основе предложения от Матье Rodic

SELECT 
    * 
FROM 
(
    SELECT 
     c.LABEL_NAME, 
     k.*, 
     dbo.kiw_GetNearMeetingLocationInMiles_FUNC(41.056466,-85.3312009,LATITUDE,LONGITUDE) as distance 
    FROM 
     USR_KIW_CUS_MEETING as k 
    JOIN 
     CUSTOMER as c on c.MASTER_CUSTOMER_ID = k.MASTER_CUSTOMER_ID 
    WHERE 
     c.USR_MEMBERSHIP_STATUS_CODE NOT IN('CR','CSD') 
)a 
WHERE 
    a.distance <= 120 
+0

'с (запрос минус последняя строка), как withDistance select * from withDistance, где расстояние <= 120;' См. Http://msdn.microsoft.com/en-us/library/ms175972.aspx – Patashu

ответ

1

Попробуйте следующее:

SELECT 
    * 
FROM 
(
    SELECT 
     c.LABEL_NAME, 
     k.*, 
     dbo.kiw_GetNearMeetingLocationInMiles_FUNC(41.056466,-85.3312009,LATITUDE,LONGITUDE) as distance 
    FROM 
     USR_KIW_CUS_MEETING as k 
    JOIN 
     CUSTOMER as c on c.MASTER_CUSTOMER_ID = k.MASTER_CUSTOMER_ID 
    WHERE 
     c.USR_MEMBERSHIP_STATUS_CODE NOT IN('CR','CSD') 
) AS computed_table 
WHERE 
    distance <= 120 

Предложение HAVING позволяет фильтровать по вычисляемым столбцам.

+0

Привет Mathieu - Ошибка SQL : Msg 207, уровень 16, состояние 1, строка 12 Недопустимое имя столбца 'distance'. – Slinky

+0

Хорошо, я отредактировал свой ответ. Он работает сейчас? –

+0

Thanks - Msg 156, Level 15, State 1, Line 16 Неверный синтаксис рядом с ключевым словом 'WHERE'. – Slinky