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 (特別参照 ID 番号) を取得します。この場合、SRID は標準緯度経度である 4326 です。すでに緯度と経度があるので、ALTER TABLE
するだけです。 地理列を追加してからUPDATE
テーブルからデータを取得する 2 つの方法を示しましたが、これを使用してインデックス付きビューを作成することはできません (インデックス付きビューには自己結合を含めることはできません)。ただし、上記に基づいて設定された、実質的にキャッシュであるセカンダリ テーブルを作成することもできます。次に、それを維持することを心配する必要があります (トリガーまたは他のプロセスを介して行うことができます)。
クロス結合により 250,000,000,000 行が得られることに注意してください。ただし、場所列の 1 つを確認するだけでよいため、検索は簡単です (つまり、
SELECT * FROM table WHERE Place1 = 'Sheffield' AND distance < 100
、2 番目は大幅に少ない行が得られますが、クエリでは Place1 列と Place2 列の両方を考慮する必要があります)。