안녕하세요?
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는 일치하는 게 없긴한데 시간이 흐르면 일치하는게 나타날 수 있는 구조이고,
컬럼 값이 같은것도 있고 다른것도 있습니다..
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 ;