by 스파이 [SQL Query] with max [2012.10.10 16:14:45]
흐으음...
WITH ELECDATA AS /* 특정 필지의 전자결재 내역 조회 */
(SELECT DISTINCT B.*
FROM CM_ELEC_APPR_REQ A, CM_ELEC_APPR B
WHERE A.APPR_REQ_TYPE_NAME LIKE 'SP_BS_%'
AND A.APPR_REQ_KEY_TEXT LIKE '00323@0@327%'
AND A.APPR_REQ_NO = B.APPR_REQ_NO)
SELECT A.USE_CNST_APPR_REQ_NO,
A.ORGT_MOV_APPR_REQ_NO,
A.AUTH_USE_CNST_APPR_REQ_NO,
A.ORGT_OWNTR_APRV_APPR_REQ_NO,
(SELECT MAX(RECMDLT_APPR_REQ_NO) FROM BS_LOAN WHERE BDD_ID=A.BDD_ID
AND BDD_TYPE = A.BDD_TYPE AND CONT_MGT_NO = A.CONT_MGT_NO )AS RECMDLT_APPR_REQ_NO,
(SELECT MAX(AR_ORGT_APPR_REQ_NO) FROM BS_LOAN WHERE BDD_ID=A.BDD_ID
AND BDD_TYPE = A.BDD_TYPE AND CONT_MGT_NO = A.CONT_MGT_NO )AS AR_ORGT_APPR_REQ_NO
FROM BS_CONTDET A, ELECDATA B, BS_LOAN C, ELECDATA B1
WHERE A.BDD_ID = '00323'
AND A.BDD_TYPE = '0'
AND A.CONT_MGT_NO = '327'
AND A.NOW_CONT_YN = 'Y'
AND A.ORGT_OWNTR_APRV_APPR_REQ_NO = B.APPR_REQ_NO(+)
AND A.BDD_ID = C.BDD_ID
AND A.BDD_TYPE = C.BDD_TYPE
AND A.CONT_MGT_NO = C.CONT_MGT_NO
AND C.AR_ORGT_APPR_REQ_NO = B1.APPR_REQ_NO
AND ROWNUM='1';
---------------------------------------------------------------------------------------
이렇게 수정을 해서 원하는 데이터를 얻긴 했는데...
이런식으로 뽑는게 효율적인지... ㅠ 으... 너무 힘드네요
-- MAX(recmdlt_appr_req_no) 와 MAX(ar_orgt_appr_req_no) 을 -- 스칼라서브쿼리로 각각 따로 가져오네요. -- 이때 서로 다른 쿼리이므로 서로 다른 행의 결과를 가져 올 수도 있습니다. -- MAX(a) 와 MAX(b) 에서 같은 행이라도 a가 크다고 해서 b도 크다는 보장은 없지요. -- 인라인뷰 안에서 Row_Number 로 번호 부여 후 밖에서 1번만 조회하면 됩니다. SELECT * FROM (SELECT ... , c.recmdlt_appr_req_no , c.ar_orgt_appr_req_no , ROW_NUMBER() OVER( PARTITION BY a.bdd_id, a.bdd_type, a.cont_mgt_no ORDER BY c.recmdlt_appr_req_no DESC ) rn FROM ... WHERE ... ) WHERE rn = 1 ;