Mohli byste udělat horší věci, než se dívat na GEOGRAPHY
datový typ, například:
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
bere zeměpisnou šířku a délku a také SRID (Special Reference ID number). V tomto případě je SRID 4326, což je standardní zeměpisná šířka a délka. Protože již máte zeměpisnou šířku a délku, stačí ALTER TABLE
přidejte sloupec geografie a poté UPDATE
k jeho osídlení.
Ukázal jsem dva způsoby, jak dostat data z tabulky, ale nemůžete s tím vytvořit indexované zobrazení (indexované pohledy nemohou mít vlastní spojení). Mohli byste však vytvořit sekundární tabulku, která je ve skutečnosti mezipamětí, která je naplněna na základě výše uvedeného. Pak se musíte starat o jeho údržbu (může to být provedeno pomocí spouštěčů nebo jiného procesu).
Všimněte si, že křížové spojení vám dá 250 000 000 000 řádků, ale vyhledávání je jednoduché, protože se stačí podívat na jeden ze sloupců míst (tj. SELECT * FROM table WHERE Place1 = 'Sheffield' AND distance < 100
, druhý vám poskytne výrazně méně řádků, ale dotaz pak musí vzít v úvahu sloupce Místo1 i Místo2).