复杂的oracle查询

时间:2012-05-21 16:28:59

标签: sql oracle

我有一个非常复杂的查询,我需要做但我似乎无法理解如何完成它所以我希望有人可以帮助我。

我需要在一个查询中进行两次查询。

我的第一个问题是:

select * from table1 t1 
join table2 t2 on t2.outcode = t1.post_code

这会产生包含LATLONG邮政编码的结果,如下所示:

  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

我不能为我的生活找到如果可能的话如何产生这个。

有人可以帮忙吗?

1 个答案:

答案 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