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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입