KEEP 질문좀드립니다..! 0 1 1,261

by matrixkdg [2013.08.08 10:29:46]


특정 쿼리에 서브 부분인데요

( SELECT  GI_GR_NO,
                PLNT_CD,
                VNDR_CD,
                MTRL_CD,
                WRHS1_CD,
                MAX(XSTAT) KEEP (   DENSE_RANK FIRST ORDER BY GI_GR_NO DESC, RCDB_DCMT_NO DESC) AS XSTAT,
                MAX(XMSGS)          KEEP (DENSE_RANK FIRST
                ORDER BY GI_GR_NO DESC, RCDB_DCMT_NO DESC) AS XMSGS,
                MAX(XDATS)          KEEP (DENSE_RANK FIRST ORDER BY GI_GR_NO DESC, RCDB_DCMT_NO DESC) AS XDATS,
                MAX(XTIMS)          KEEP (DENSE_RANK FIRST ORDER BY GI_GR_NO DESC, RCDB_DCMT_NO DESC) AS XTIMS,
                MAX(SAP_DCMT1_NO)   KEEP (DENSE_RANK FIRST ORDER BY GI_GR_NO DESC, RCDB_DCMT_NO DESC) AS SAP_DCMT1_NO,
                MAX(RCDB_TPCD)      KEEP (DENSE_RANK FIRST ORDER BY GI_GR_NO DESC, RCDB_DCMT_NO DESC) AS RCDB_TPCD,
                MAX(RCDB_DCMT_NO)   KEEP (DENSE_RANK FIRST ORDER BY GI_GR_NO DESC, RCDB_DCMT_NO DESC) AS RCDB_DCMT_NO
         FROM   GSWHME07
         WHERE  1=1
         AND    SUBSTR(GI_GR_NO,1,1) = 'W'
         GROUP BY GI_GR_NO,PLNT_CD,VNDR_CD,MTRL_CD,WRHS1_CD )


KEEP이라는게  서브의 서브에서 참조할수 없어서 쓰는걸로 알고있는데
이구조라면 KEEP을 쓰지 않아도 되는 쿼리 아닌가요..?(혹 이 쿼리 자체가 서브라  서브의 서브인식 되어 KEEP을 쓰는건가요?)

by 마농 [2013.08.08 10:38:58]

KEEP이라는게  서브의 서브에서 참조할수 없어서 쓰는걸로 알고있는데
이구조라면 KEEP을 쓰지 않아도 되는 쿼리 아닌가요..?(혹 이 쿼리 자체가 서브쿼리라는 가정하에 KEEP을 쓴는건가요?)
==> 뭔말인지 전혀 모를 문구네요...
==> Keep 은 Group 안에서 정렬결과의 처음, 또는 마지막 자료를 조회할 때 사용합니다.


위 구문의 Keep 사용도 불필요한 부분이 많이 보입니다.
그룹 내에서 정렬하기 때문에 그룹의 기준인 GI_GR_NO로 정렬할 필요가 없습니다.
RCDB_DCMT_NO 만 정렬키로 사용하면 된다는 말이구요.
MAX(RCDB_DCMT_NO) 부분엔 굳이 KEEP 을 쓸 필요가 없죠. 단지 MAX 만 하면 되죠.

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