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 41284 게시물 읽기
No. 41284
connect by 이후 조인할때 order by 깨지는것 문의드려요...
작성자
서기라(서기라)
작성일
2016-11-17 16:44ⓒ
2016-11-17 16:48ⓜ
조회수
6,245

 

 
    SELECT A.DEPT_CODE as oflcd,
    B.DEPT_NAME       as oflvNm,
    sum(empTot) empTot,
    MAX(DECODE ( school_car_code , 'T' , EMP_NAME ))                as dgrdr,
    MAX(DECODE ( school_car_code , 'Q' , EMP_NAME ))                as dgrma,
    MAX(DECODE ( school_car_code , 'M' , EMP_NAME ))                as univGrdt,
    MAX(DECODE ( school_car_code , 'L' , EMP_NAME ))                as colgeGrdt,
    MAX(DECODE ( school_car_code , 'H' , EMP_NAME ))                as hischGrdt,
    MAX(DECODE ( school_car_code , 'Z' , EMP_NAME , '' , EMP_NAME)) as othr
  FROM
    (
    
    SELECT DEPT_CODE ,
      school_car_codE ,
      SUBSTR(MAX(SYS_CONNECT_BY_PATH(EMP_NAME, ',')), 2) AS EMP_NAME ,
      sum(1)                                             as empTot
    FROM
      (select A.EMP_NO,
        EMP_NAME ,
        school_car_code,
        A.DEPT_CODE,
        ROW_NUMBER() OVER(PARTITION BY A.DEPT_CODE,school_car_codE ORDER BY A. DEPT_CODE,school_car_codE) AS RNUM
      from hr_orde_master A,
        hr_pers_master B
      where A.EMP_NO                         =B.EMP_NO
      AND (A.EMP_no, apply_order_date, seq) in
        (select emp_no,
          substr(dateseq,1,8),
          to_number(substr( dateseq,9,1))
        from
          (select emp_no,
            max(apply_order_date
            ||to_char(seq)) dateseq
          from hr_orde_master
          where emp_no in
            (select emp_no
            from hr_pers_master a
            where a.company_code like '100'
            and a.join_date <= to_char((LAST_DAY( TO_DATE(substr(20161117,1,6)
              ||'01'))),'YYYYMMDD')
            and (a.retire_date >= to_char((LAST_DAY( TO_DATE(substr(20161117,1,6)
              ||'01'))),'YYYYMMDD')
            or a.retire_date is null )
            )
          and apply_order_date <= to_char((LAST_DAY(TO_DATE( substr(20161117,1,6)
            ||'01'))),'YYYYMMDD')
          and confirm_tag = 'Y'
          group by emp_no
          )
        )
      )
      START WITH RNUM        = 1
      CONNECT BY PRIOR RNUM  = RNUM - 1
    AND PRIOR DEPT_CODE      = DEPT_CODE
    AND PRIOR school_car_code=school_car_code
    GROUP BY DEPT_CODE ,
      school_car_code
    order by DEPT_CODE ,school_car_code
    ) A,
    VW_HR_CODE_DEPT B
  WHERE A.DEPT_CODE=B.DEPT_CODE
  GROUP BY A.DEPT_CODE ,
    B.DEPT_NAME ,
    ROW_NUM
  ORDER BY ROW_NUM
  
 
 
 
위와같은 쿼리인데요... 가장밖의 A와 B를 조인하면 A쿼리만  실행할때와는 다른 데이터들이 나오더라구요.
아마도 조인하면서 order by 가 풀리던가? 뭐 꼬이는거 같은데 이럴때는 무슨 조건을 주어야 할런지요? 궁금합니다.

 

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

추가로 가장밖의 A테이블을

select b.* from (A) b 

이런식으로 서브쿼리로만 들어가도 그냥 A만 실행했을때와는 다른 데이터가 나르네요...

왜그럴까요

서기라(서기라)님이 2016-11-18 09:07에 작성한 댓글입니다.

 해결하였습니다.. 

안쪽의 쿼리를

 

 

 

SELECT 

ROW_NUMBER ()

                            OVER (PARTITION BY A1.DEPT_CODE ORDER BY A1.DEPT_CODE)

                            AS num,

A1.DEPT_CODE,

A1.school_car_codE,

SUBSTR(MAX(SYS_CONNECT_BY_PATH(A1.EMP_NAME, ',')), 2) AS EMP_NAME ,

MAX(CNT) AS EMPTOT

FROM

(

 

SELECT DEPT_CODE ,

      school_car_codE ,

       EMP_NAME ,

      ROW_NUMBER ()

        OVER (PARTITION BY DEPT_CODE ,school_car_code

              ORDER BY emp_name) AS rnum,

     COUNT ( * )

        OVER (PARTITION BY DEPT_CODE ,school_car_code) CNT

    FROM

      (select A.EMP_NO,

        EMP_NAME ,

        school_car_code,

        A.DEPT_CODE--,

      from hr_orde_master A,

        hr_pers_master B

      where A.EMP_NO                         =B.EMP_NO

      AND (A.EMP_no, apply_order_date, seq) in

        (select emp_no,

          substr(dateseq,1,8),

          to_number(substr( dateseq,9,1))

        from

          (select emp_no,

            max(apply_order_date

            ||to_char(seq)) dateseq

          from hr_orde_master

          where emp_no in

            (select emp_no

            from hr_pers_master a

            where a.company_code like '100'

            and a.join_date <= to_char((LAST_DAY( TO_DATE(substr(20161117,1,6)

              ||'01'))),'YYYYMMDD')

            and (a.retire_date >= to_char((LAST_DAY( TO_DATE(substr(20161117,1,6)

              ||'01'))),'YYYYMMDD')

            or a.retire_date is null )

            )

          and apply_order_date <= to_char((LAST_DAY(TO_DATE( substr(20161117,1,6)

            ||'01'))),'YYYYMMDD')

          and confirm_tag = 'Y'

          group by emp_no

          )

        )

      )

 

    ORDER BY DEPT_CODE ,school_car_code

) A1

      START WITH RNUM        = 1

      CONNECT BY PRIOR RNUM  = RNUM - 1

    AND PRIOR DEPT_CODE      = DEPT_CODE

    AND PRIOR school_car_code=school_car_code

group by A1.DEPT_CODE, A1.school_car_codE, A1.cnt

 

 

이런식으로 변경하여 해결했습니다.

허나 이게 왜 이렇게 해야 되는지는 모르겠네요.

아시는분 답변주시면 감사하겠습니다.

서기라(서기라)님이 2016-11-18 11:26에 작성한 댓글입니다.

정렬이 흐트러 지는 이유는
  - 조인의 내부 과정 때문입니다.
복잡한 쿼리의 개선이 필요해 보입니다.
  - 최근 1건만 조회하기 위해
    - max 서브쿼리 사용 대신, row_number 를 이용할 수 있습니다.
  - 그룹별 사원이름을 하나로 합치기 위해
    - sys_connect_by_path 대신 listagg 사용 가능합니다. (11G)
    - 하위버전이라면 wm_concat(10g), xmlagg(9i) 사용 가능합니다.

마농(manon94)님이 2016-11-18 14:01에 작성한 댓글입니다.

 어머.. 그렇군요. 한번 변경해보아야겠습니다. 감사합니다.

서기라(서기라)님이 2016-11-25 10:12에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41288계층형 쿼리관련 질문입니다.... [1]
윤주호
2016-11-24
6177
41287일자별 전월, 당월, 증감 통계 쿼리 질문입니다. [4]
이담원
2016-11-24
7258
41285중복관련 쿼리 질문입니다 [1]
김홍석
2016-11-18
6111
41284connect by 이후 조인할때 order by 깨지는것 문의드려요... [4]
서기라
2016-11-17
6245
41282Java에서, 다른 pc에 있는 dbms연결이 안됩니다. 뭐가 문제죠? [1]
최현일
2016-11-13
5734
41281특정컬럼 안에 있는 데이터 변환 [2]
워즈
2016-11-10
5990
41280마농님 도와주세요 프로시져에서 막히네요 ㅠㅠ loop관련 도움 주세요 ㅠㅠ [1]
최종욱
2016-11-09
6094
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다