Я пытаюсь найти предприятия в радиусе 25 миль от точки и увидел «правильный» запрос MySQL от Google здесь (http://code.google.com/apis/maps/articles/phpsqlsearch.html#findnearsql):
SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) *
cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat))))
AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;
Однако моя база данных находится в Oracle, и я хотел преобразовать этот запрос в oracle, так что вот что я создал, что, похоже, тоже работает.
SELECT id, ( 3959 * acos( cos( degree2radian(41.912434) ) * cos( degree2radian( latitude ) ) * cos( degree2radian( longitude ) - degree2radian(-87.6357596) ) + sin( degree2radian(41.912434) ) * sin( degree2radian( latitude ) ) ) ) AS distance
FROM markers
GROUP BY id, latitude, longitude
HAVING ( 3959 * acos( cos( degree2radian(41.912434) ) * cos( degree2radian( latitude ) ) * cos( degree2radian( longitude ) - degree2radian(-87.6357596) ) + sin( degree2radian(41.912434) ) * sin( degree2radian( latitude ) ) ) ) < 25 ;
, где я также определил функцию:
create or replace
FUNCTION degree2radian(pin_Degree IN NUMBER)
RETURN NUMBER DETERMINISTIC IS
BEGIN
RETURN pin_Degree / 57.2957795; --1R = 180C
END degree2radian;
Кажется, что все работает, но я не уверен, правильно ли я преобразовал запрос, и если да, есть ли проблемы с производительностью или какие-либо способы, которыми я могу очистить этот запрос (т. Е. Принцип СУХОЙ и т. Д.) ??