1

実行する必要がある非常に複雑なクエリがありますが、それを達成する方法について頭を悩ませているように見えないので、誰かが私を助けてくれることを願っています.

2 つのクエリを 1 つのクエリにする必要があります。

私の最初のクエリはこれです:

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とLONGに基づいて距離を計算する機能です

それを置き換える:postcodeCB8、これらの結果が生成されます

Location_name     Distance
  NR Location         56.6

私が何とかする必要があるのは、単一のクエリから次の出力を生成することです。

  Name    Postcode          Lat         Long    Nearest_Loc     Distance
Taylor         CB8    53.829517    -1.780320    NR Location         56.6

可能であれば、これをどのように作成するかを一生考えることはできません。

誰でも助けることができますか?

4

1 に答える 1

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
于 2012-05-21T16:39:17.713 に答える