Запрос для возврата строк, которые находятся в пределах определенного географического расстояния до данной строки (с помощью 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