首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:计算城镇与多个其他位置之间的距离

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

Stack Overflow用户
提问于 2019-10-19 11:57:23
回答 2查看 224关注 0票数 0

我在Oracle中有三个表:

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

城镇:列出城镇ID、城镇名称、城镇经度和城镇纬度。这里有15行(意思是15个城镇)。

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

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

为了计算距离,我使用了geodistance函数(从dual中选择geodistance(纬度1,经度1,纬度2,经度2) )。

我可以通过在城镇ID上连接酒店到城镇来获得酒店及其各自的经度和纬度的列表,也可以通过在城镇ID上加入旅游景点到城镇来获得旅游景点及其各自的经度和纬度的列表,但这是在另一个查询中。当我尝试编写一个查询时,我得到一个‘单行子查询返回多行’错误。

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

任何帮助都是非常感谢的。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-19 20:48:37

您似乎想要一个cross join和距离计算:

代码语言:javascript
复制
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;

如果出于某种学究的原因不允许使用cross join,一个可能的等价物是:

代码语言:javascript
复制
hotel h join
attraction a
on 1=1

或者在Oracle 12C中:

代码语言:javascript
复制
hotel h cross apply
attraction a

如果你有5家酒店,20个景点,并且想要100行,那么cross join就是你想要的。我会说这个限制是没有意义的。

票数 0
EN

Stack Overflow用户

发布于 2019-10-19 13:19:16

您需要hoteltown表之间的内部连接,这将给你5条记录,然后与tourist_attraction表交叉连接,它产生100条记录(5*20)。您还需要再次使用town表连接此表,以获得旅游景点位置。

您可以使用以下查询:

代码语言:javascript
复制
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.

请根据需要调整geodistance函数的参数。

干杯!!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58460399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档