inner join -> outer join으로 변경 질문드립니다.. 0 1 1,557

by 너구링 [Oracle 기초] [2017.04.22 19:22:52]



SELECT H.*
	      FROM (SELECT G.*
					  ,ROW_NUMBER() OVER(PARTITION BY G.TOP_MENU_CD ORDER BY G.TOP_MENU_ORD, G.MID_MENU_ORD, G.MENU_ORD) ROWNUM1
				      ,COUNT(*) OVER(PARTITION BY G.TOP_MENU_CD) AS CNT1
				      ,ROW_NUMBER() OVER(PARTITION BY G.TOP_MENU_CD, G.MID_MENU_CD ORDER BY G.TOP_MENU_ORD, G.MID_MENU_ORD, G.MENU_ORD) AS ROWNUM2
				      ,COUNT(*) OVER(PARTITION BY G.TOP_MENU_CD, G.MID_MENU_CD) AS CNT2
				  FROM (SELECT F.TOP_MENU_NM
						      ,F.MID_MENU_NM
						      ,F.MENU_NM
						      ,F.MENU_CNT
						      ,F.RECENT_DATE
						      ,F.TOP_MENU_CD
						      ,F.MID_MENU_CD
						      ,F.MENU_CD
						      ,F.TOP_MENU_ORD
						      ,NVL(F.MID_MENU_ORD, 0) AS MID_MENU_ORD
						      ,NVL(F.MENU_ORD, 0) AS MENU_ORD
						  FROM (SELECT B.TOP_MENU_CD
									  ,C.MENU_NM AS TOP_MENU_NM
									  ,C.MENU_ORD AS TOP_MENU_ORD
								      ,B.MID_MENU_CD
								      ,D.MENU_NM AS MID_MENU_NM
								      ,D.MENU_ORD AS MID_MENU_ORD
								      ,B.MENU_CD
								      ,E.MENU_NM
								      ,E.MENU_ORD
								      ,B.MENU_CNT
								      ,TO_CHAR(TO_DATE(B.RECENT_DATE, 'YYYYMMDDHH24MISS'), 'YYYY-MM-DD HH24:MI') AS RECENT_DATE
								  FROM (SELECT A.TOP_MENU_CD
											  ,A.MID_MENU_CD
										      ,A.MENU_CD
										      ,SUM(A.MENU_CNT) AS MENU_CNT
										      ,MAX(TO_NUMBER(A.YMD || A.HMS)) AS RECENT_DATE
										      ,A.LANG_CD
										  FROM (SELECT MENU_CD AS TOP_MENU_CD
											   	      ,0 AS MID_MENU_CD
											          ,0 AS MENU_CD
											   	      ,MENU_CNT
											          ,YMD
											          ,HMS
											          ,LANG_CD
											      FROM TB_AOS
											     WHERE YMD BETWEEN #{sdate}
											                   AND #{edate}
											       AND LANG_CD = #{G_LANG_CD}
											       AND TOP_MENU_CD = 0
											       AND LOG_GUBUN = #{logGubun}
											   UNION ALL
											   SELECT TOP_MENU_CD
											   	     ,MENU_CD AS MID_MENU_CD
											         ,0 AS MENU_CD
											   	     ,MENU_CNT
											         ,YMD
											         ,HMS
											         ,LANG_CD
											     FROM TB_AOS
											    WHERE YMD BETWEEN #{sdate}
											                  AND #{edate}
											      AND LANG_CD = #{G_LANG_CD}
											      AND TOP_MENU_CD <![CDATA[ <> ]]> 0
											      AND MID_MENU_CD = 0
											      AND LOG_GUBUN = #{logGubun}
											   UNION ALL
											   SELECT TOP_MENU_CD
											   	     ,MID_MENU_CD
											         ,MENU_CD
											   	     ,MENU_CNT
											         ,YMD
											         ,HMS
											         ,LANG_CD
											     FROM TB_AOS
											    WHERE YMD BETWEEN #{sdate}
											                  AND #{edate}
											      AND LANG_CD = #{G_LANG_CD}
											      AND TOP_MENU_CD <![CDATA[ <> ]]> 0
											      AND MID_MENU_CD <![CDATA[ <> ]]> 0
											      AND LOG_GUBUN = #{logGubun}) A
												 GROUP BY A.TOP_MENU_CD, A.MID_MENU_CD, A.MENU_CD, A.LANG_CD) B
								      ,TB_BBOS C								
									  ,TB_BBOS D
									  ,TB_BBOS E
								 WHERE B.LANG_CD = C.LANG_CD (+)
								   AND B.LANG_CD = D.LANG_CD (+)
								   AND B.LANG_CD = E.LANG_CD (+)
								   AND B.TOP_MENU_CD = C.MENU_CD (+)
								   AND B.MID_MENU_CD = D.MENU_CD (+)
								   AND B.MENU_CD = E.MENU_CD (+)) F
						ORDER BY F.TOP_MENU_ORD, F.MID_MENU_ORD, F.MENU_ORD) G) H
		ORDER BY H.TOP_MENU_ORD, H.MID_MENU_ORD, H.ROWNUM1, H.ROWNUM2, H.MENU_ORD

 

위의 JOIN쿼리를 RIGHT OUTER JOIN으로 바꾸고 싶은데.. 

알리아스 C D E 부분에서 OUTER JOIN으로 바꿔줬더니..에러가 납니다. 

저렇게 1:1관계가 아닌 1:다 관계일 때 OUTER JOIN으로 어떻게 바꾸는지.. 조언 부탁드립니다.

by 마농 [2017.04.24 09:06:54]

아우터 조인은 문제 없어 보입니다.
 - 다른데 문제는 없는지 오류메시지 확인하세요.
TO_NUMBER 는 불필요해 보입니다.
 - 문자형 자체로도 MAX 가능합니다.
계속되는 인라인뷰 사용은 쿼리를 복잡하게 보이게 합니다.
 - F 까지 처리후에 g, h 이후 처리는 불필요해 보입니다.
 - F 안쪽에서 모두 함께 처리 가능합니다.
부등호(<>) 비교를 위한 cdata 처리는
 - 부등호를 != 로 바꾸면 cdata 안해도 됩니다.

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