2013-02-21 3 views
5

오라클에서 세 개의 테이블을 조인 외부 왼쪽내가 세 개의 테이블이

다음

enter image description here

은 무엇입니까 내가 지금까지 시도했다.

SELECT table1.tb1_a, 
CASE WHEN table3.tb3_a IS NOT NULL THEN 
    tb3_b 
    ELSE 'No city for him yet' 
END AS 'City' 
FROM table1 
LEFT OUTER JOIN table2 ON 
    table1.tb1_a = table2.tb2_a 
LEFT OUTER JOIN table3 ON 
    table2.tb2_a = table3.tb3_a 
WHERE table3.tb3_a IN 
    (

    ) 

그리고 지금 내가 이런

+0

자체를 설명 곳이 당신이 실제로'tb2_b'의 최대 값을 원하는 생각 생각 그런 다음 'tb3_a'에 참여하십시오. – ninesided

+0

현재 시도 중에 실수가 있다고 생각합니다. tb2_a와 tb3_a를 비교합니다. tb2_b와 tb3_a를 비교해야합니다. –

+0

@Walter - 내 말이 맞아요. – ninesided

답변

2

도움을 희망 :

SELECT t1.tb1_a, COALESCE(t3.tb3_a, 'No city for him yet') AS City 
FROM table1 t1 
LEFT JOIN (
    SELECT MAX(tb2_b) AS tb2_b, tb2_a 
    FROM table2 
    GROUP BY tb2_a 
) t2 ON (t2.tb2_a = t1.tb1_a) 
LEFT JOIN table3 t3 ON (t3.tb3_a = t3.tb2_b); 

중요한 점은 우리가 가상의 종류를 만드는 중간에 인라인 (in-line)이다 각 tb2_a에 대해 최대 tb2_b 값을 포함하는 테이블. 그런 다음 원하는 결과를 얻기 위해이 항목에 참여할 수 있습니다.

+0

안녕하세요. 답변과 시간 내 주셔서 감사합니다. – javanoob

+0

@javanoob - 당신은 가장 환영합니다. – ninesided

1

뭔가

select tb1_a, nvl(max(city), 'no city for him yet') thecity 
from etc 
group by tbl_a 
1

일을해야 tb3_a 컬럼의 최대 값을 선택하는 방법에 어려움을 겪고 있어요 난 당신이 분석 기능이 작업을 수행 할 수 생각합니다.

SELECT tb1_a, coalesce(tb3_b, 'No city for him yet') as City 
from (select table1.tb1_a, tb3_b, 
      ROW_NUMBER() over (partition by table1.tbl1_a order by tb3_a desc) as seqnum 
     FROM table1 LEFT OUTER JOIN 
      table2 
      ON table1.tb1_a = table2.tb2_a LEFT OUTER JOIN 
      table3 
      ON table2.tb2_a = table3.tb3_a 
    ) t 
where seqnum = 1 

이 표 3의 마지막 항목을 결정하기 위해 row_number()를 사용하여 여기에 방법이다. 이것은 where seqnum = 1 절에 의해 선택됩니다.

+0

덕분에 도움이되었습니다. – javanoob

0

이 필요한 일을해야한다,이 시도는

with table_1 as 
(select 10 as tb1_a, 'John' as tb1_b 
    from dual 
    union all 
    select 20 as tb1_a, 'John1' as tb1_b 
    from dual 
    union all 
    select 30 as tb1_a, 'John2' as tb1_b from dual), 
table_2 as 
(select 10 as tb2_a, 100 as tb2_b 
    from dual 
    union all 
    select 10 as tb2_a, 1000 as tb2_b 
    from dual 
    union all 
    select 10 as tb2_a, 10000 as tb2_b 
    from dual 
    union all 
    select 20 as tb2_a, 200 as tb2_b 
    from dual 
    union all 
    select 20 as tb2_a, 2000 as tb2_b 
    from dual 
    union all 
    select 20 as tb2_a, 20000 as tb2_b from dual), 
table_3 as 
(select 100 as tb3_a, 'City1' as tb3_b 
    from dual 
    union all 
    select 1000 as tb3_a, 'City10' as tb3_b 
    from dual 
    union all 
    select 10000 as tb3_a, 'City100' as tb3_b 
    from dual 
    union all 
    select 200 as tb3_a, 'City2' as tb3_b 
    from dual 
    union all 
    select 2000 as tb3_a, 'City20' as tb3_b 
    from dual 
    union all 
    select 20000 as tb3_a, 'City200' as tb3_b from dual) 

select user_id, city 
    from (select u.tb1_a as user_id, 
       nvl(c.tb3_b, 'No city') as city, 
       rank() over(partition by u.tb1_a order by tb3_a) as city_rank 
      from table_1 u, table_2 u_c, table_3 c 
     where u.tb1_a = u_c.tb2_a(+) 
      and u_c.tb2_b = c.tb3_a(+)) t1 
where city_rank = 1 
1

이 작동 :

SELECT table1.tb1_a, 
     CASE WHEN table3.tb3_a IS NOT NULL THEN tb3_b 
      ELSE 'No city for him yet' 
     END AS City, 
table2.*, table3.* 
FROM table1 
LEFT OUTER JOIN table2 ON table1.tb1_a = table2.tb2_a 
LEFT OUTER JOIN table3 ON table2.tb2_b = table3.tb3_a 
where tb2_b = (select max(tb2_b) 
       from table2 t22 
       where t22.tb2_a = tb1_a) 
or tb2_b is null 
order by 1 

http://sqlfiddle.com/#!4/7ba1c/12 내가 절 내가 여기 사람들을 혼동 할 수 어떻게 생각

+0

이것은 놀라운 것입니다. 잘못 빨리 처리하고있었습니다. sqlfiddle에서 테이블과 모든 것을 준비하는 데 감사드립니다. – javanoob

+0

@ Juergen, 쿼리가 올바른 결과를 반환하는 반면 결과 집합에서 반환 된 각 행에 대해 하위 쿼리를 한 번 실행해야하므로 WHERE 절에 상관 된 하위 쿼리가 매우 비쌀 수 있습니다. – ninesided

관련 문제