2010-01-08 20 views
3

J'ai une table avec plusieurs enregistrements, chacun contient un champ appelé "coords". Ce champ a été mis à jour avec un point géographique.Requête pour renvoyer les lignes situées dans une certaine distance géographique à une ligne donnée (à l'aide de sql server 2008)

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

Ce que je dois faire est ... lorsqu'un utilisateur est connecté, ils ont un dossier qui leur appartient, pour cet exemple dit son record id # 1. Ils ont besoin de visiter une page qui montre tous les autres enregistrements dont le champ "coords" est situé à une certaine distance.

C'est le meilleur que j'ai imaginé; Premièrement, je peux trouver le début coordonné avec cette déclaration;

SELECT coords FROM testing WHERE id=1 

Cela me donne l'origine comme coords.Lat et coordonne coords.Long

Je voudrais trouver les PROXIMITE, j'ai donc cela; Je ne sais pas comment mettre les coords d'origine, dans cette deuxième instruction pour le faire fonctionner.

Ai-je besoin d'une procédure stockée, ou puis-je mettre en quelque sorte les coords.Lat/coords.Long à l'intérieur des supports de la STDistance? Ou suis-je tottaly hors base sur comment je m'attends à ce que cela fonctionne.

FYI, j'ai très peu d'expérience avec SQL Server, je n'ai jamais rien fait "avancé", seulement select * from table where record = 1 simples et inserts de base et mises à jour.

+0

@Drew: Bienvenue à SO, s'il vous plaît épargner quelques minutes pour lire la documentation simple démarquage. Les bases sont là pour vous permettre de lire lorsque vous modifiez ou créez une question dans la marge de gauche. – AnthonyWJones

Répondre

0

Je l'ai résolu moi-même avec 2 sélections et 2 variables ... Des suggestions pour l'améliorer?

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 
1

cela fonctionnerait-il?

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

Que diriez-vous cette ?:

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