SQL:计算城镇与多个其他位置之间的距离

SQL:计算城镇与多个其他位置之间的距离,sql,oracle,Sql,Oracle,我在Oracle中有三个表: 酒店: 列出酒店编号、酒店名称和酒店所在的城镇ID。这里有5排,意味着5家旅馆,但不是每个城镇都有旅馆 城镇: 列出城镇ID、城镇名称、城镇经度和城镇纬度。这里有15排,意味着15个城镇 旅游景点: 列出景点编号、景点名称以及景点所在的城镇ID。这里有20行意味着20个旅游景点,一些城镇可能有多个景点,其他城镇可能没有景点 基本上我想做的是计算出每个酒店和每个景点之间的直线距离。例如,我想要酒店1和景点1之间的距离,然后是酒店1和景点2之间的距离,酒店1和景点3之间

我在Oracle中有三个表:

酒店: 列出酒店编号、酒店名称和酒店所在的城镇ID。这里有5排,意味着5家旅馆,但不是每个城镇都有旅馆

城镇: 列出城镇ID、城镇名称、城镇经度和城镇纬度。这里有15排,意味着15个城镇

旅游景点: 列出景点编号、景点名称以及景点所在的城镇ID。这里有20行意味着20个旅游景点,一些城镇可能有多个景点,其他城镇可能没有景点

基本上我想做的是计算出每个酒店和每个景点之间的直线距离。例如,我想要酒店1和景点1之间的距离,然后是酒店1和景点2之间的距离,酒店1和景点3之间的距离,依此类推

要使用地理距离函数计算距离,请从dual中选择地理距离纬度1、经度1、纬度2、经度2

通过在城镇ID上加入酒店到城镇,我可以获得酒店列表及其各自的经度和纬度。通过在城镇ID上加入旅游景点到城镇,我还可以获得旅游景点列表及其各自的经度和纬度,但在另一个查询中。当我尝试编写一个查询时,会出现“单行子查询返回多行”错误

限制之一是不能使用交叉联接来获得所需的结果。我希望我的输出是100行,每个酒店从酒店到景点的距离为20,但我完全不知道如何在不使用交叉连接的情况下做到这一点

感谢您的帮助


提前谢谢

您需要在酒店和城镇表之间进行内部连接,这将为您提供5条记录,然后与旅游景点表交叉连接,这将产生100条记录5*20。您还需要再次将其与town table连接,以获得旅游景点的位置

您可以使用以下查询:

Select h.hotel_number, 
h.hotel_name,
T.town_name,
Ta.attraction_name,
Tatown.name attraction_town_name,
geodistance(t.latitude, t.longitude, tatown.latitude, tatown.longitude) dist
From hotel h
Join town t on (h.town_id = t.town_id)
Join tourist_attraction ta on (1=1) -- way of doing cross join
Join town tatown (tatown.town_id = ta.town_id) -- used to fetch location of tourist attraction.
请根据需要调整大地距离函数的参数

干杯

您似乎需要交叉连接和距离计算:

select ha.*
from (select h.*, a.*,
             geodistance(h.latitude, h.longitude, a.latitude, a.longitude) as distance,
             row_number() over (partition by h.hotelid order by geodistance(h.latitude, h.longitude, a.latitude, a.longitude) as seqnum
      from hotel h cross join
           attraction a
     ) ha
where seqnum < 20;
或者在Oracle 12C中:

hotel h cross apply
attraction a

如果你有5家酒店,20个景点,想要100排,那么交叉连接就是你想要的。我想说这个限制毫无意义。

你能分享一下你的方案吗?我要回答的一个限制是,事先不应该拒绝任何合适的技术解决方案,包括交叉连接。你为什么说这个限制?它起作用了!谢谢你,伙计,你真是个救命恩人!若解决方案解决了您的问题,那个么在回答问题的左侧打勾,以便将其标记为已解决
hotel h cross apply
attraction a