Можете да направите по-лошо от това да погледнете GEOGRAPHY
тип данни, например:
CREATE TABLE Places
(
SeqID INT IDENTITY(1,1),
Place NVARCHAR(20),
Location GEOGRAPHY
)
GO
INSERT INTO Places (Place, Location) VALUES ('Coventry', geography::Point(52.4167, -1.55, 4326))
INSERT INTO Places (Place, Location) VALUES ('Sheffield', geography::Point(53.3667, -1.5, 4326))
INSERT INTO Places (Place, Location) VALUES ('Penzance', geography::Point(50.1214, -5.5347, 4326))
INSERT INTO Places (Place, Location) VALUES ('Brentwood', geography::Point(52.6208, 0.3033, 4326))
INSERT INTO Places (Place, Location) VALUES ('Inverness', geography::Point(57.4760, -4.2254, 4326))
GO
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
FROM Places p1
CROSS JOIN Places p2
GO
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
FROM Places p1
INNER JOIN Places p2 ON p1.SeqID > p2.SeqID
GO
geography::Point
взема географската ширина и дължина, както и SRID (специален референтен идентификационен номер). В този случай SRID е 4326, което е стандартна ширина и дължина. Тъй като вече имате географска ширина и дължина, можете просто да ALTER TABLE
за да добавите географската колона, след това UPDATE
за да го попълните.
Показах два начина за извличане на данните от таблицата, но не можете да създадете индексиран изглед с това (индексираните изгледи не могат да имат самообединяване). Бихте могли обаче да създадете вторична таблица, която на практика е кеш, който се попълва въз основа на горното. След това просто трябва да се тревожите за поддържането му (може да се направи чрез тригери или някакъв друг процес).
Обърнете внимание, че кръстосаното съединение ще ви даде 250 000 000 000 реда, но търсенето е лесно, тъй като трябва да погледнете само една от колоните с места (т.е. SELECT * FROM table WHERE Place1 = 'Sheffield' AND distance < 100
, вторият ще ви даде значително по-малко редове, но след това заявката трябва да вземе предвид както колоната Place1, така и Place2).