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

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

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

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

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

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

SELECT coords FROM testing WHERE id=1

Это дает мне исходную координату как координаты. Лат и координаты. Длинный

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

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

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

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

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

3 ответа

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

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

Это будет работать?

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

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

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
Другие вопросы по тегам