Bạn có thể làm tệ hơn là nhìn vào GEOGRAPHY
kiểu dữ liệu, ví dụ:
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
lấy vĩ độ và kinh độ cũng như SRID (số ID tham chiếu đặc biệt). Trong trường hợp này, SRID là 4326, là vĩ độ và kinh độ tiêu chuẩn. Vì bạn đã có vĩ độ và kinh độ, bạn có thể chỉ cần ALTER TABLE
để thêm cột địa lý rồi đến UPDATE
để điền nó.
Tôi đã chỉ ra hai cách để lấy dữ liệu ra khỏi bảng, tuy nhiên bạn không thể tạo chế độ xem được lập chỉ mục bằng cách này (các chế độ xem được lập chỉ mục không thể có tự kết hợp). Mặc dù bạn có thể tạo một bảng phụ có hiệu quả là một bộ nhớ cache, được điền dựa trên những điều trên. Sau đó, bạn chỉ phải lo lắng về việc duy trì nó (có thể được thực hiện thông qua trình kích hoạt hoặc một số quy trình khác).
Lưu ý rằng kết hợp chéo sẽ cung cấp cho bạn 250.000.000.000 hàng, nhưng việc tìm kiếm rất đơn giản vì bạn chỉ cần nhìn vào một trong các cột địa điểm (tức là SELECT * FROM table WHERE Place1 = 'Sheffield' AND distance < 100
, câu thứ hai sẽ cung cấp cho bạn ít hàng hơn đáng kể, nhưng truy vấn sau đó cần phải xem xét cả cột Place1 và Place2).