아우터 조인 필터링 관련 질문입니다. 0 2 3,323

by 커피요쿠르트d [SQL Query] outer join 아우터조인 조회조건 조건 아우터 조인 [2014.02.24 14:15:22]


수고하십니다. 

식사는 맛나게 하셨나요? 


쿼리 짜다 궁금한게 있어 질문드립니다. 

간단한 아우터 조인인데요.  간단하지 않네요. ㅠㅠ

문제가..

조회 조건이 되는 칼럼이 OUTER테이블의 칼럼입니다. 

그래서 원하는대로 쉽게 되지 않아서요.

배경 .

TBL1, TBL2 두 테이블이 있습니다. 

TBL1의 자료를 바탕으로 일정 조건에 해당되는 ROW들만 
TBL2에 자료가 INSERT되어 있습니다. 

해서 두 테이블을 조인하면 TBL1의 자료가 TBL2에는 없는 경우도 있어요.

두 테이블을 조인하여 자료를 가져오고자합니다.
그냥 LEFT OUTER조인하였습니다. 




:PARAM  을 파라미터라 할경우


질문 1 

where절의 조건으로 들어가는 파라미터가 넘어올 때도 있고 안넘어올 때도 있습니다.
(전체 조회의 경우이죠..) .
안넘어오면 전체조회, 넘어오면 넘어오는 값으로 필터링 하고 싶은데요/

아래의 쿼리는 당연히 안되는 거지요;;;ㅜㅜ
대충 아래와 같은 쿼리를 원합니다..
---
WITH TBL1 AS(
 SELECT '111' AS KEY1, '2013' AS YEAR FROM DUAL UNION ALL 
 SELECT '222' AS KEY1, '2013' AS YEAR FROM DUAL UNION ALL 
 SELECT '333' AS KEY1, '2013' AS YEAR FROM DUAL UNION ALL 
 SELECT '444' AS KEY1, '2013' AS YEAR FROM DUAL 
), TBL2 AS (
 SELECT '111' AS KEY1, '2013' AS YEAR, 'Y' AS FLAG FROM DUAL UNION ALL 
 SELECT '444' AS KEY1, '2013' AS YEAR, 'N' AS FLAG FROM DUAL 
)
SELECT A.KEY1, A.YEAR, A.FLAG 
FROM TBL1 A, TBL2 B 
WHERE A.KEY1 = B.KEY1(+)
AND B.FLAG(+) LIKE :PARAM ||'%'
;
--

:PARAM 값이 Y    면 FLAG값이 Y인 한 ROW만
:PARAM 값이 N    면 FLAG값이 N인 한 ROW만
:PARAM 값이 없으면 4개의 ROW 모두가

조회되게 하고 싶습니다. 


자바에서 :PARAM 값에 따라 쿼리를 동적으로 하면 되긴하는데..
이게 쿼리로 해보고 싶어서요..;; 
바보 같은 짓일까요? ㅜㅜ


그래서 해본게..

OR을 이용해서 .
--
 

WITH TBL1 AS(
 SELECT '111' AS KEY1, '2013' AS YEAR FROM DUAL UNION ALL 
 SELECT '222' AS KEY1, '2013' AS YEAR FROM DUAL UNION ALL 
 SELECT '333' AS KEY1, '2013' AS YEAR FROM DUAL UNION ALL 
 SELECT '444' AS KEY1, '2013' AS YEAR FROM DUAL 
), TBL2 AS (
 SELECT '111' AS KEY1, '2013' AS YEAR, 'Y' AS FLAG FROM DUAL UNION ALL 
 SELECT '444' AS KEY1, '2013' AS YEAR, 'N' AS FLAG FROM DUAL 
)
SELECT A.KEY1, A.YEAR , B.FLAG 
FROM TBL1 A, TBL2 B 
WHERE A.KEY1 = B.KEY1(+)
AND (
 ( :PARAM IS NULL AND 1 = 1 ) -- 넘어오는 값이 없으면 필터링 없이..
 OR
 ( :PARAM IS NOT NULL AND B.FLAG = :PARAM) -- 넘어오는 값있으면 그 값으로 필터링
 )
;

--
위와 같이 처리 해봤는데.
조회 결과는 내가 원하는 대로 되는데..

실제 이런 경우에 이런식으로 처리해도 되는지 궁금합니다. 
그리고 다른 분들께서는 어떤식으로 처리하시는지도 알고 싶어서 글 올려봅니다.

좋은 방법 있으시면 가르침 좀 부탁드립니다. 


질문 2

위와 비슷한 경우인데요. 

조회 조건이

아우터테이블에 없는 자료도 모두 함께 조회
아우터테이블에 있는 자료만 조회

이런식으로 있을 경우는 어떻게 처리하면 되나요?
예를 들어 조건이 아우터테이블에 있는 자료만 조회로 넘어오면 
아래와 같이 하면 될까요?

--
 

WITH TBL1 AS(
 SELECT '111' AS KEY1, '2013' AS YEAR FROM DUAL UNION ALL 
 SELECT '222' AS KEY1, '2013' AS YEAR FROM DUAL UNION ALL 
 SELECT '333' AS KEY1, '2013' AS YEAR FROM DUAL UNION ALL 
 SELECT '444' AS KEY1, '2013' AS YEAR FROM DUAL 
), TBL2 AS (
 SELECT '111' AS KEY1, '2013' AS YEAR, 'Y' AS FLAG FROM DUAL UNION ALL 
 SELECT '444' AS KEY1, '2013' AS YEAR, 'N' AS FLAG FROM DUAL 
)
SELECT * FROM (
 SELECT 
 A.KEY1
 , A.YEAR
 , B.FLAG
 , NVL(B.FLAG, 'FALSE') AS IS_EXIST -- TBL2에 자료가 있는지 확인
 FROM TBL1 A, TBL2 B 
 WHERE A.KEY1 = B.KEY1(+) 
)WHERE IS_EXIST <> 'FALSE'
;
 

---

이런식으로 플래그 하나 만들어서 한번 더 조회를 해야할까요?
ㅜㅠ

쿼리 한방에 위 2조건을 각각 처리할 수 있는 방법이 있을까요
도움 바랍니다.

오전 내내 머리 싸매 보지만 딱히 좋은 생각이 나지 않네요. 



원래는 질문1과 질문2가 하나의 쿼리도 돌아가야하지만 
내용 설명의 편의를 위해 따로 올려봤습니다. 

그럼 고수님들의 도움 바랍니다. 

이런 경우가 충분히 있을 것으로 생각되는데요. 다른 분들께서는 어떻게 처리하시는지 궁금하네요.;;

쿼리 한 방으로 할려고 하는게 바보같은 짓을까요?   ㅋ

- ,.- ;;



읽어주셔서 감사합니다.
즐거운 오후 보내시길 바랍니다.
by 마농 [2014.02.24 15:38:20]
SELECT a.key1, a.year, b.flag 
  FROM tbl1 a
     , tbl2 b
 WHERE a.key1 = b.key1(+)
   AND a.year = b.year(+)    -- 연도 조건이 누락된 듯 하구요.
   AND NVL(b.flag, 'X') LIKE :p_Flag || '%'    -- 위처럼 해도 됩니다.
   AND NVL2(b.flag, 'TRUE', 'FALSE') = :p_Exists
;

by 커피요쿠르트d [2014.02.25 09:29:59]
마농님 감사합니다!

올려주신 댓글 보니 심히 부끄럽네요.. ㅠㅠ
하지만 정말 감사합니다. 


즐거운 하루 보내시길 바랄게요.






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