SQL STDistance, где оба местоположения находятся в одной записи - PullRequest
0 голосов
/ 02 декабря 2018

Я новичок в географических запросах SQL.У меня есть две таблицы;[station_information], которая описывает станции проката велосипедов с пространственным столбцом типа geography, и [bike_rides], которая содержит информацию о поездках на прокатных велосипедах.

[station_information] имеет station_id в качестве первичного ключа, а [bike_rides] имеет to_station_id и столбец from_station_id, ссылающийся на начальную и конечную станции велосипедных поездок.Я хочу создать столбец расстояний в [bike_rides] с расстоянием между from_station_id и to_station_id для каждой записи.

Как мне это сделать?Я знаю, что должен присоединиться к столам и использовать STDistance, но я не знаю этого.Каждый пример STDistance, который я посмотрел, создает переменные для начальной и конечной точек и использует STGeomFromText для создания точки или использует пространственные столбцы из двух разных таблиц.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 03 декабря 2018

Я предполагаю, что ваша схема выглядит примерно так:

create table dbo.station_information (
   station_id int not null
      constraint PK_station_information primary key clustered (station_id),
   location geography not null
);

create table  dbo.bike_rides (
    bike_ride_id int not NULL
        constraint PK_bike_rides primary key clustered (bike_ride_id),
    from_station_id INT
        constraint [FK_bike_rides_origin]
        foreign key (from_station_id)
        references dbo.station_information (station_id),
    to_station_id INT
        constraint [FK_bike_rides_destination]
        foreign key (to_station_id)
        references dbo.station_information (station_id)
);

Если это так, следующий запрос должен концептуально перебить вас:

select br.bike_ride_id, 
   origin.[location].STDistance(destination.[location])
from dbo.bike_rides as br
join dbo.station_information as origin
    on br.from_station_id = origin.station_id
join dbo.station_information as destination
    on br.to_station_id = destination.station_id;

Объединения в запросепросто нормально "присоединиться к месту, где есть детали, которые я хочу".Единственная странная вещь (если вы можете назвать ее странной) состоит в том, что у вас есть два столбца, которые ссылаются на одну и ту же таблицу, поэтому вам нужно присоединиться к этой таблице дважды (по одному разу для каждого контекста, в котором вы хотите получить детали).

После того, как эти объединения выполнены, вам доступны столбцы географии происхождения и назначения, и вы можете выполнять любые геопространственные вычисления, которые вам нужны.

...