database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40709 게시물 읽기
No. 40709
FULL OUTER JOIN 시 토드에선 돌아가는데 운영할땐 오류가 나서요..
작성자
디비잘하고싶다
작성일
2015-02-05 10:24ⓒ
2015-02-05 11:06ⓜ
조회수
8,527

 

 

SELECT /*+opt_param('_optimizer_cost_based_transformation', 'off')*/ 

      FN_GET_CRYPT ('D', D.RES_NO) AS EMP_REG_NO,

               A.RENT_HABT_CLS                     AS A_RENT_HABT_CLS,

               A.RENT_AGNT_NM                     AS A_RENT_AGNT_NM,

               CASE WHEN A.RES_NO IS NOT NULL THEN FN_GET_CRYPT('D', A.RES_NO) END    AS A_RES_NO,

               NVL(A.RENT_CNTRCT_ADDR, ' ')        AS A_RENT_CNTRCT_ADDR,

               A.CNTRCT_FRM_DT                     AS A_CNTRCT_FRM_DT,

               A.CNTRCT_TO_DT                     AS A_CNTRCT_TO_DT,

               A.RENT_HOUSE_CLS AS A_RENT_HOUSE_CLS,

               A.RENT_HOUSE_AREA AS A_RENT_HOUSE_AREA,

               NVL(A.HOUSE_RENT, 0)             AS A_HOUSE_RENT,

               NVL(A.RENT_HABT_SUB_AMT, 0)         AS A_RENT_HABT_SUB_AMT,

               B.RENT_HABT_CLS                     AS B_RENT_HABT_CLS,

               B.RENT_AGNT_NM                     AS B_RENT_AGNT_NM,

               CASE WHEN B.RES_NO IS NOT NULL THEN FN_GET_CRYPT('D', B.RES_NO) END    AS B_RES_NO,

               B.CNTRCT_FRM_DT                     AS B_CNTRCT_FRM_DT,

               B.CNTRCT_TO_DT                     AS B_CNTRCT_TO_DT,

               NVL(B.BRRW_INTR_RAT, 0)             AS B_BRRW_INTR_RAT,

               NVL(B.PNINT_SUM, 0)                 AS B_PNINT_SUM,

               NVL(B.PNINT_PRNCPAL, 0)             AS B_PNINT_PRNCPAL,

               NVL(B.PNINT_INTR, 0)             AS B_PNINT_INTR,

               NVL(B.RENT_HABT_SUB_AMT, 0)         AS B_RENT_HABT_SUB_AMT,

               C.RENT_HABT_CLS                     AS C_RENT_HABT_CLS,

               C.RENT_AGNT_NM                     AS C_RENT_AGNT_NM,

               CASE WHEN C.RES_NO IS NOT NULL THEN FN_GET_CRYPT('D', C.RES_NO) END    AS C_RES_NO,

               C.RENT_CNTRCT_ADDR                 AS C_RENT_CNTRCT_ADDR,

               C.CNTRCT_FRM_DT                     AS C_CNTRCT_FRM_DT,

               C.CNTRCT_TO_DT                     AS C_CNTRCT_TO_DT,

               NVL(C.LFSTS_GRNTY_AMT, 0)         AS C_LFSTS_GRNTY_AMT,

                  C.RENT_HOUSE_CLS AS  C_RENT_HOUSE_CLS,

               C.RENT_HOUSE_AREA AS  C_RENT_HOUSE_AREA

          FROM (SELECT ROWNUM AS CNT,

                       RENT_HABT_CLS,

                       RENT_AGNT_NM,

                       RES_NO,

                       RENT_CNTRCT_ADDR,

                       CNTRCT_FRM_DT,

                       CNTRCT_TO_DT,

                       HOUSE_RENT,

                       RENT_HABT_SUB_AMT,

                       RENT_HOUSE_CLS,

                       RENT_HOUSE_AREA

                  FROM PAY_WRK_RENT_HABT_SPEC

                 WHERE YY = #YY# 

                   AND EMP_NO = #EMP_NO# 

                   AND DUTY_DEG = #DUTY_DEG# 

                   AND RENT_HABT_CLS = 'A0' 

                   AND RENT_HABT_SUB_AMT  > 0) A

    FULL OUTER JOIN      (SELECT ROWNUM AS CNT,

                                       RENT_HABT_CLS,

                                       RENT_AGNT_NM,

                                       RES_NO,

                                       CNTRCT_FRM_DT,

                                       CNTRCT_TO_DT,

                                       BRRW_INTR_RAT,

                                       PNINT_SUM,

                                       PNINT_PRNCPAL,

                                       PNINT_INTR,

                                       RENT_HABT_SUB_AMT

                                  FROM PAY_WRK_RENT_HABT_SPEC

                                 WHERE     YY = #YY#

                                       AND EMP_NO = #EMP_NO#

                                       AND DUTY_DEG = #DUTY_DEG#

                                       AND RENT_HABT_CLS = 'B0' 

                                       AND RENT_HABT_SUB_AMT  > 0) B

ON A.CNT = B.CNT

         FULL OUTER JOIN  (SELECT ROWNUM AS CNT,

                                       RENT_HABT_CLS,

                                       RENT_AGNT_NM,

                                       RES_NO,

                                       RENT_CNTRCT_ADDR,

                                       CNTRCT_FRM_DT,

                                       CNTRCT_TO_DT,

                                       LFSTS_GRNTY_AMT,

                                       RENT_HOUSE_CLS,

                                       RENT_HOUSE_AREA

                                  FROM PAY_WRK_RENT_HABT_SPEC

                                WHERE     YY = #YY#

                              AND EMP_NO = #EMP_NO#

                              AND DUTY_DEG = #DUTY_DEG#

                              AND RENT_HABT_CLS = 'C0' 

                              AND EXISTS (SELECT * 

                                                     FROM PAY_WRK_RENT_HABT_SPEC

                                                    WHERE     YY = #YY#

                                                          AND EMP_NO = #EMP_NO#

                                                          AND DUTY_DEG = #DUTY_DEG#

                                                          AND RENT_HABT_CLS = 'B0' AND RENT_HABT_SUB_AMT  > 0)) C

ON NVL(A.CNT, B.CNT) = C.CNT

               LEFT OUTER JOIN PAY_WRK_FMLY D ON D.YY = #YY#

                                              AND D.EMP_NO = #EMP_NO#

                                              AND D.DUTY_DEG = #DUTY_DEG#                     

 

 

쿼리는 위와 같구요.

FULL OUTER JOIN 때문에  내부오류코드, 인수:[qcscpqbTxt],[600],[].... []

 

이런 오류가 나거든요.

오라클 버그로 

VIEW MERGING, 서브쿼리 NESTING   이런 게 허용이 안되는거 같은데..

 

UNION ALL , GROUP BY 쓰면 된다고 본거같은데..

초보라 혼자 변경하기 조금 버거운 느낌입니다.

쿼리 잘짜시는분들 도와주십시요..

 

참고로 오라클 10G이며 패치를 한다던지 그런 건 할수없는 상황입니다.

 

이 글에 대한 댓글이 총 8건 있습니다.

○ Full Outer Join 때문이라고요?
  - 그런 구문은 안보이는데요?
○ 잘 돌아가는 쿼리라구요? 조건이 이상한데요?
  - 조인 대상 집합이 4개인데 (a, b, c, d)
  - 조인 조건이 전혀 없네요?
  - 조인 조건이 없는 이유가 각 집합이 모두 1건씩만 있는거라서 그런건가요?
  - D 를 아우터 조인 하신것도 반대로 한 듯 하네요
  - D 를 기준으로 a, b, c 를 아우터 조인 거는게 맞을 듯.

마농(manon94)님이 2015-02-05 10:49에 작성한 댓글입니다.

 쿼리 다시 올렸습니다.

FULL OUTER JOIN 뺴고 테스트한다고 그걸 갖다가 올렸네요 

그리고 문제가..

10G 버그인지 몰라도..

토드에선 돌아가는데 운영시스템에선 내부 오류코드 이런 오류가 떨어져서요 

 

FULL OUTER JOIN 으로 데이터를 맞추려고 기존에 이렇게 짜여진거 같은데 

풀 아우터 조인을 대체할수 있는 쿼리가 다시 만들어져야 맞을꺼같아서요

디비잘하고싶다님이 2015-02-05 11:09에 작성한 댓글입니다.
이 댓글은 2015-02-05 11:15에 마지막으로 수정되었습니다. Edit

 그리고 LEFT OUTER JOIN 걸린 PAY_WRK_FMLY

을 조인 건이유가 PAY_WRK_FMLY의  주민등록번호만 기준이 되는거지

풀 아우터 조인을 거는 PAY_WRK_RENT_HABT_SPEC  

테이블의 데이터를 뽑아서  열을 행으로? 이런식으로 가로로 늘어 트리기 위해서 

조인을 걸었어요.

디비잘하고싶다님이 2015-02-05 11:13에 작성한 댓글입니다. Edit

각 a, b, c, d 집합의 건수는 각각 어떻게 나오게 되나요?

d 는 없을 수도 있어서 아우터 조인인가요? 항상 있다면 이너조인이 맞습니다.

마농(manon94)님이 2015-02-05 11:25에 작성한 댓글입니다.
이 댓글은 2015-02-05 11:26에 마지막으로 수정되었습니다.

 A만 건수가 9개 있고

나머진 없습니다.

 

말씀대로 INNER JOIN 이 맞는거 같습니다.

항상있어야하는데이터니깐요.

 

디비잘하고싶다님이 2015-02-05 11:40에 작성한 댓글입니다. Edit

d 는 1건인거죠?

마농(manon94)님이 2015-02-05 12:49에 작성한 댓글입니다.

SELECT *
  FROM (SELECT fn_get_crypt('D', d.res_no) AS emp_reg_no
          FROM pay_wrk_fmly d
         WHERE d.yy       = #YY#
           AND d.emp_no   = #EMP_NO#
           AND d.duty_deg = #DUTY_DEG#
        ) d
     , (SELECT MIN(DECODE(gb, 1, rent_habt_cls    )) AS a_rent_habt_cls   
             , MIN(DECODE(gb, 1, rent_agnt_nm     )) AS a_rent_agnt_nm    
             , MIN(DECODE(gb, 1, res_no           )) AS a_res_no          
             , MIN(DECODE(gb, 1, rent_cntrct_addr )) AS a_rent_cntrct_addr
             , MIN(DECODE(gb, 1, cntrct_frm_dt    )) AS a_cntrct_frm_dt   
             , MIN(DECODE(gb, 1, cntrct_to_dt     )) AS a_cntrct_to_dt    
             , MIN(DECODE(gb, 1, rent_house_cls   )) AS a_rent_house_cls  
             , MIN(DECODE(gb, 1, rent_house_area  )) AS a_rent_house_area 
             , MIN(DECODE(gb, 1, house_rent       )) AS a_house_rent      
             , MIN(DECODE(gb, 1, rent_habt_sub_amt)) AS a_rent_habt_sub_amt
             , MIN(DECODE(gb, 2, rent_habt_cls    )) AS b_rent_habt_cls   
             , MIN(DECODE(gb, 2, rent_agnt_nm     )) AS b_rent_agnt_nm    
             , MIN(DECODE(gb, 2, res_no           )) AS b_res_no          
             , MIN(DECODE(gb, 2, cntrct_frm_dt    )) AS b_cntrct_frm_dt   
             , MIN(DECODE(gb, 2, cntrct_to_dt     )) AS b_cntrct_to_dt    
             , MIN(DECODE(gb, 2, brrw_intr_rat    )) AS b_brrw_intr_rat   
             , MIN(DECODE(gb, 2, pnint_sum        )) AS b_pnint_sum       
             , MIN(DECODE(gb, 2, pnint_prncpal    )) AS b_pnint_prncpal   
             , MIN(DECODE(gb, 2, pnint_intr       )) AS b_pnint_intr      
             , MIN(DECODE(gb, 2, rent_habt_sub_amt)) AS b_rent_habt_sub_amt
             , MIN(DECODE(gb, 3, rent_habt_cls    )) AS c_rent_habt_cls   
             , MIN(DECODE(gb, 3, rent_agnt_nm     )) AS c_rent_agnt_nm    
             , MIN(DECODE(gb, 3, res_no           )) AS c_res_no          
             , MIN(DECODE(gb, 3, rent_cntrct_addr )) AS c_rent_cntrct_addr
             , MIN(DECODE(gb, 3, cntrct_frm_dt    )) AS c_cntrct_frm_dt   
             , MIN(DECODE(gb, 3, cntrct_to_dt     )) AS c_cntrct_to_dt    
             , MIN(DECODE(gb, 3, lfsts_grnty_amt  )) AS c_lfsts_grnty_amt 
             , MIN(DECODE(gb, 3, rent_house_cls   )) AS c_rent_house_cls  
             , MIN(DECODE(gb, 3, rent_house_area  )) AS c_rent_house_area 
          FROM (SELECT rent_habt_cls
                     , rent_agnt_nm
                     , ROW_NUMBER()
                       OVER(PARTITION BY rent_habt_cls ORDER BY 1) rn
                     , CASE WHEN rent_habt_cls = 'A0' THEN 1
                            WHEN rent_habt_cls = 'B0' THEN 2
                            WHEN rent_habt_cls = 'C0'
                             AND COUNT(DECODE(rent_habt_cls, 'B0', 1))
                                 OVER() > 0           THEN 3
                        END gb
                     , fn_get_crypt('D', res_no) res_no
                     , rent_cntrct_addr
                     , rent_house_cls
                     , rent_house_area
                     , rent_habt_sub_amt
                     , cntrct_frm_dt
                     , cntrct_to_dt
                     , brrw_intr_rat
                     , pnint_intr
                     , pnint_prncpal
                     , pnint_sum
                     , house_rent
                     , lfsts_grnty_amt
                  FROM pay_wrk_rent_habt_spec
                 WHERE a.yy                = #YY#     
                   AND a.emp_no            = #EMP_NO# 
                   AND a.duty_deg          = #DUTY_DEG#
                   AND a.rent_habt_sub_amt > 0
                   AND a.rent_habt_cls IN ('A0','B0','C0')
                )
         GROUP BY rn
        ) a
 ORDER BY rn
;

마농(manon94)님이 2015-02-05 13:13에 작성한 댓글입니다.
이 댓글은 2015-02-05 13:14에 마지막으로 수정되었습니다.

 마뇽님 덕분에 잘 해결되었네요.

감사합니다.

 

항상 보던건데..

마뇽님 일과 시간에도 이렇게 자주 쿼리 잘 짜 주시더라구요!!

 

명불허전입니다.

디비잘하고싶다님이 2015-02-05 15:09에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40715쿼리 문의드립니다. [2]
초초초
2015-02-10
7465
40711오라클 테이블 두개 COUNT 연산 관련하여 질문드립니다 [1]
최효석
2015-02-06
7639
40710plsql command window에서 프로시져 컴파일 시 & 문자 무시하고 컴파일 시키는 명령어가 있죠? [1]
궁금이
2015-02-06
7075
40709FULL OUTER JOIN 시 토드에선 돌아가는데 운영할땐 오류가 나서요.. [8]
디비잘하고싶다
2015-02-05
8527
40708자동 Row생성 [3]
카이백작
2015-02-04
8213
40707update 문 도와주세요 [2]
편두통
2015-02-02
8633
40706문자열 자르기 쿼리 관련 문의 [5]
돈방석
2015-02-02
7770
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다