Применить STDistance ко всем строкам таблицы? - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь вернуть все строки из [store] с расстояния менее 10 миль. Таблица [Store] имеет столбец типа Geography.

Я понимаю, как найти расстояние между двумя конкретными точками, примерно так:

declare @origin geography
select @origin = geography::STPointFromText('POINT(' + CAST(-73.935242 AS 
VARCHAR(20)) + ' ' + CAST(40.730610 AS VARCHAR(20)) + ')', 4326)

declare @destination geography
select @destination = geography::STPointFromText('POINT(' + CAST(-93.732666 AS VARCHAR(20)) + ' ' + CAST(30.274096 AS VARCHAR(20)) + ')', 4326)

select @origin.STDistance(@destination)/ 1609.344 as 'distance in miles'

У меня проблемы с применением этой логики к SELECT заявлению. Вместо того, чтобы получать расстояние между @origin и @destination, я хотел бы получить расстояние в милях между @origin и store.Geolocation для всех рядов.

1 Ответ

0 голосов
/ 26 апреля 2019

Метод STDistance, используемый из одного экземпляра Geography и применяемый к другому, возвращает расстояние между двумя точками. Может использоваться с переменными, например, @Origin.STDistance( @Destination ), столбцы или их комбинации, например, найти все магазины в радиусе 10 миль от конкретного @Origin:

select *
  from Store
  where @Origin.STDistance( Store.Geolocation ) < 1609.344 * 10.0;

Примечание. Как отметил БенТул, обработка пространственного индекса немного непостоянна. STDistance по сравнению с константой - SARGable: @Origin.STDistance( Store.Geolocation ) < 1609.344 * 10.0, но это математически эквивалентное выражение не: @Origin.STDistance( Store.Geolocation ) / 1609.344 < 10.0. Эта «особенность» задокументирована здесь .

...