Запрос на возврат строк, которые находятся в пределах определенного географического расстояния до данной строки (с использованием SQL Server 2008) - PullRequest
3 голосов
/ 09 января 2010

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

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)

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

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

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

Ответы [ 3 ]

1 голос
/ 09 января 2010

будет ли это работать?

SELECT
    [near].* 
FROM 
    testing [near]
INNER JOIN
    testing [user] ON
    [user].coords.STDistance( [near].coords ) < (20 * 1609.344)
WHERE
    [user].id = 1
1 голос
/ 16 января 2010

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

 DECLARE @g geography;
 SELECT @g = coords FROM testing WHERE id=1;        
 SELECT * FROM testing WHERE coords.STDistance(@g) <=(20 * 1609.344)
0 голосов
/ 09 января 2010

Я решил это сам с 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
...