다른 테이블 두 개를 union 하지 않고...! 0 2 1,026

by 초초 [Oracle 기초] [2019.03.21 13:11:36]


안녕하세요?

table main, a, b 이렇게 세 개가 있을 때,

main의 어떤 flag에 따라 a와 조인하거나 b와 조인해야 하는데요..!

그래서 기존에는 

select * from main, a, where main.fid = a.id

union all

select * from main, b, where main.fid = b.id

이렇게 가져왔었습니다..

그런데 쿼리가 너무 느려서 union을 사용하지않고

개선을 해보고싶은데 이럴때는 어떻게 해야하는것일까요?

 

참고로 a와 b의 id는 일치하는 게 없긴한데 시간이 흐르면 일치하는게 나타날 수 있는 구조이고,

컬럼 값이 같은것도 있고 다른것도 있습니다..

by 우리집아찌 [2019.03.21 13:43:48]
/*
 a 테이블이랑 join 할경우 'A' 라는 파리미터를
 b 테이블이랑 join 할경우 'B' 라는 파리미터를
 넘겨받는수 있다면

*/

select *   
  from main 
     , a
 where main.fid = a.id
   and 'A' = :TB        -- :TB는 넘겨받는 파라미터
union all

select * 
  from main
     , b
 where main.fid = b.id
   and 'B' = :TB         -- :TB는 넘겨받는 파라미터
   

 


by 마농 [2019.03.21 13:50:12]

1. 아우터 조인 형태로도 가능합니다.
2. Union 후에 조인한 방법도 있구요
3. 그런데 과연 union 때문에 느린걸까요?
 - 다른 이유는 없는지 확인이 필요해 보입니다.
 - 올려주신 쿼리도 많은 부분이 생략되어 있어서 실체 파악이 어렵네요.
 - flag 의 역할이나, 조회 항목들이 어떤게 있는지?
 - 다른 조건은 없는지 등등
 

-- 0. 원본 쿼리에 flag 조건 추가
SELECT m.fid
     , a.id
     , a.nm
  FROM main m
     , a
 WHERE m.fid  = a.id
   AND m.flag = 1
 UNION ALL
SELECT m.fid
     , b.id
     , b.nm
  FROM main m
     , b
 WHERE m.fid  = b.id
   AND m.flag = 2
;
-- 1. outer join
SELECT m.fid
     , DECODE(m.flag, 1, a.id, b.id) id
     , DECODE(m.flag, 1, a.nm, b.nm) nm
  FROM main m
     , a
     , b
 WHERE DECODE(m.flag, 1, m.fid) = a.id(+)
   AND DECODE(m.flag, 2, m.fid) = b.id(+)
;
-- 2. Union 후 Join
SELECT m.fid
     . c.id
     , c.nm
  FROM main m
     , (SELECT 1 flag, id, nm FROM a
         UNION ALL
        SELECT 2 flag, id, nm FROM b
        ) c
 WHERE m.flag = c.flag
   AND m.fid  = c.id
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입