我有一个非常复杂的查询,我需要做但我似乎无法理解如何完成它所以我希望有人可以帮助我。
我需要在一个查询中进行两次查询。
我的第一个问题是:
select * from table1 t1
join table2 t2 on t2.outcode = t1.post_code
这会产生包含LAT
和LONG
邮政编码的结果,如下所示:
Name Postcode Lat Long
Taylor CB8 53.829517 -1.780320
这些只是用于测试目的的虚拟值。
我的下一个问题是这个
SELECT * FROM (
SELECT t3.location_name,
calc_distance(t3.lat, t3.lng, t2.lat,t2.lng) as distance
FROM table3 t3, table2 t2
where t2.outcode = :postcode
order by distance) i
where rownum = 1
calc_distance
是一个根据LAT& amp;计算距离的函数。很长一点
如果我将:postcode
替换为CB8
,则会产生这些结果
Location_name Distance
NR Location 56.6
我需要做的是从单个查询中生成以下输出。
Name Postcode Lat Long Nearest_Loc Distance
Taylor CB8 53.829517 -1.780320 NR Location 56.6
我不能为我的生活找到如果可能的话如何产生这个。
有人可以帮忙吗?
答案 0 :(得分:1)
您可以在此处有效使用ROW_NUMBER()
。通过对t2.outcode
进行分区并按distance
排序,我们可以找到每个结果的最小距离(t3.rn = 1
)。
SELECT
t1.Name,
t1.Postcode,
t2.Lat,
t2.Long,
t3.Nearest_Loc,
t3.Distance
From
table1 t1
INNER join table2 t2 on t2.outcode = t1.post_code
LEFT JOIN (
SELECT t3.location_name,
calc_distance(t3.lat, t3.lng, t2.lat,t2.lng) as distance,
row_number() over (partition by t2.outcode
order by calc_distance(t3.lat, t3.lng, t2.lat,t2.lng)
) rn,
t2.outcode
FROM table3 t3, table2 t2
) t3
on t1.Postcode = t3.PostCode
and t3.rn = 1