2012-05-21 4 views
1

필자는 필자가 필요로하는 매우 복잡한 쿼리를 가지고있다. 그러나 필자는 누군가가 나를 도울 수 있기를 바란다.복잡한 오라클 쿼리

두 쿼리를 하나의 쿼리로 만들어야합니다. 테스트 목적으로

Name Postcode   Lat   Long 
Taylor   CB8 53.829517 -1.780320 

이들은 단지 더미 값 :

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

LAT 그래서 같은 우편 번호의 LONG을 포함하는 결과를 생성합니다

내 첫 번째 쿼리는이입니다.

나의 다음 쿼리는 내가이 결과

Location_name  Distance 
    NR Location   56.6 
을 생산 CB8으로 :postcode을 대체 할 경우 포인트

의 LAT & 시간에 따른 거리를 계산하는 기능이

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입니다

어떻게 든해야 할 일은 다음과 같은 결과물을 단일 쿼리.

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

가능하다면 내 생애에서 어떻게 이것을 만들어 낼 수 없습니까?

아무도 도와 줄 수 있습니까?

+0

첫 번째 쿼리와 함께 왼쪽 결합을 시도하십시오. – Vishal

+0

@Vishal 확장 할 수 있습니까? 왼쪽 조인을 시도했지만 왼쪽 조인을 볼 수 없습니까? –

+0

제쳐두고, [Oracle Locator] (http://docs.oracle.com/html/B10826_01/sdo_locator.htm)가 사용자 정의 함수와 같은 이런 유형에 더 적합하다는 것을 알 수 있습니다. 그 밖의 것이 없다면, SDO_GEOMETRY 타입을 인덱싱 할 수 있습니다. 이렇게하면이 정렬에 대한 쿼리를 훨씬 빠르게 수행 할 수 있습니다. – Allan

답변

1

여기서 ROW_NUMBER()을 효과적으로 사용할 수 있습니다. 분할로 t2.outcodedistance 정렬 우리는 각 outcode (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 
+0

답해 주셔서 감사합니다. -'ORA-06553 - 잘못된 숫자 또는 유형 인수 '오류가 발생했으며이 행'row_number() over (partition by t2.outcode order by distance)에 의해 행해진 것 같습니다. rn ,'어떤 생각? –

+0

row_number()에서 거리 별칭을 사용할 수 있는지 확실하지 않습니다.이 row_number()를 (calc_distance (t3.lat, t3.lng, t2.lat, t2.lng))' –

+0

Brilliant - 정말 고맙습니다. –