我在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个距离),但我完全不知道如何在不使用交叉连接的情况下做到这一点。
任何帮助都是非常感谢的。
提前感谢!
发布于 2019-10-19 20:48:37
您似乎想要一个cross join和距离计算:
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,一个可能的等价物是:
hotel h join
attraction a
on 1=1或者在Oracle 12C中:
hotel h cross apply
attraction a如果你有5家酒店,20个景点,并且想要100行,那么cross join就是你想要的。我会说这个限制是没有意义的。
发布于 2019-10-19 13:19:16
您需要hotel和town表之间的内部连接,这将给你5条记录,然后与tourist_attraction表交叉连接,它产生100条记录(5*20)。您还需要再次使用town表连接此表,以获得旅游景点位置。
您可以使用以下查询:
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函数的参数。
干杯!!
https://stackoverflow.com/questions/58460399
复制相似问题