Запрос на возврат строк, находящихся на определенном географическом расстоянии от заданной строки (с использованием sql server 2008)

У меня есть таблица с несколькими записями, каждая из которых содержит поле под названием «координаты». Это поле было обновлено с указанием географической точки.

UPDATE testing SET [coords] = geography::Point(52.029736, -113.973541, 4326)
WHERE id=2"

Что мне нужно сделать, это ... когда пользователь вошел в систему, у него есть запись, которая принадлежит ему, в этом примере говорится, что его идентификатор записи # 1. Им необходимо посетить страницу, на которой показаны все остальные записи, чье поле «coords» находится на определенном расстоянии.

Это лучшее, что я придумал;

Во-первых, я могу найти старт, согласованный с этим утверждением;

SELECT coords FROM testing WHERE id=1

Это дает мне исходную координату как coords.Lat и coords.Long

Тогда я хотел бы найти поблизости, так что у меня есть это;

SELECT * FROM testing WHERE coords.STDistance() <=(20 * 1609.344)

Я не знаю, как поместить исходные координаты во второй оператор, чтобы он заработал.

Нужна ли мне хранимая процедура, или я могу как-то поместить координаты coords.Lat/coords.Long в скобки STDistance? Или я совершенно не понимаю, как я ожидаю, что это сработает.

К вашему сведению, у меня очень мало опыта работы с sql server, я никогда не делал ничего "продвинутого", только простые select * from table where record = 1 и базовые вставки и обновления.


person Drew    schedule 08.01.2010    source источник
comment
@Drew: Добро пожаловать в SO, пожалуйста, уделите несколько минут, чтобы прочитать простую документацию по уценке. Вы можете прочитать основы, когда редактируете или создаете вопрос на левом поле.   -  person AnthonyWJones    schedule 09.01.2010


Ответы (3)


это сработает?

SELECT
    [near].* 
FROM 
    testing [near]
INNER JOIN
    testing [user] ON
    [user].coords.STDistance( [near].coords ) < (20 * 1609.344)
WHERE
    [user].id = 1
person Gabriele Petrioli    schedule 09.01.2010

Как насчет этого?:

 DECLARE @g geography;
 SELECT @g = coords FROM testing WHERE id=1;        
 SELECT * FROM testing WHERE coords.STDistance(@g) <=(20 * 1609.344)
person user252256    schedule 16.01.2010

Я сам решил это с двумя вариантами выбора и двумя переменными ... Есть предложения по улучшению?

sql1 = "SELECT coords.Lat, coords.Long FROM testing WHERE id=1"
lat2 = rs(0)
lon2 = rs(1)
sql2 = "SELECT * FROM testing WHERE id <> 1 AND coords.STDistance(geography::Point(" & lat2 & ", " & lon2 & ", 4326)) <=(20 * 1609.344)"
'20 miles or less
person Drew    schedule 09.01.2010