쿼리 중복제거 질문입니다. 0 5 2,666

by 네루네코 [SQL Query] [2010.09.03 13:52:33]


안녕하세요. 제가 지금 쿼리를 작성하는데, 조인을 거는 테이블에 중복되는 동일값들 때문에 리스트의 COUNT를 체크할시에 데이터 수가 늘어나 버려서 그것을 제거하는데 어려움을 겪고 있습니다.

SELECT  COUNT(*)
FROM TGTR_FEE_RCP_REQ    RCP
    ,   TGCM_EMP     EMP
    ,       TGTR_FEE_STL_DTL    STL
WHERE   EMP.EMP_NO = RCP.EMP_NO
AND     (RCP.RCP_REQ_DT = STL.RCP_REQ_DT AND RCP.RCP_REQ_SEQ = STL.RCP_REQ_SEQ)
AND     (RCP.MGT_BRNNO = :mgt_brnno OR :mgt_brnno IS NULL)
AND     RCP.EMP_NO = :emp_no
AND     RCP.RCP_REQ_DT BETWEEN :inq_dt_fr AND :inq_dt_to
AND    (RCP.PROC_ST = :st OR :st IS NULL)
;

위의 쿼리입니다. TGTR_FEE_RCP_REQ 테이블의 내용을 조회하는데, EMP와 STL 테이블은 컬럼값들의 일부를 가져오기 위해 조인을 걸었습니다. 그런데 STL테이블에 동일값으로 중복되는 항목들이 있어서 전체데이터 갯수보다 많아지는 현상이 일어나는데 그 중복을 어떻게 제거해야될까요 ㅠ_ㅠ?

부탁드립니다 선배님들 ㅠ_ㅠ

by 知音 [2010.09.03 13:59:18]
SELECT COUNT(distinct 유일한키컬럼)
FROM TGTR_FEE_RCP_REQ RCP
, TGCM_EMP EMP
, TGTR_FEE_STL_DTL STL
WHERE EMP.EMP_NO = RCP.EMP_NO
AND (RCP.RCP_REQ_DT = STL.RCP_REQ_DT AND RCP.RCP_REQ_SEQ = STL.RCP_REQ_SEQ)
AND (RCP.MGT_BRNNO = :mgt_brnno OR :mgt_brnno IS NULL)
AND RCP.EMP_NO = :emp_no
AND RCP.RCP_REQ_DT BETWEEN :inq_dt_fr AND :inq_dt_to
AND (RCP.PROC_ST = :st OR :st IS NULL)

by neruneco [2010.09.03 14:06:41]
STL 테이블에서 기준이 되는 키가 두가지인데 (STL.RCP_REQ_DT, STL.RCP_REQ_SEQ) 그것 두개가 동시에 중복되는것만 삭제해야 되서, 그것에 DISTINCT를 어떻게 적용하는지를 모르곘어서 올렸습니다 ㅠ_ㅠ...

한컬럼에 걸어버리면 엉망이 되기 때문에... 저 두 컬럼 전부가 중복되는 데이터만 삭제하여야 합니다 ㅠㅠ

by 마농 [2010.09.03 14:31:25]
단순 Count 만 구하는 거라면? stl을 조인할 필요는 없습니다.
In 이나 Exists 구문으로 stl을 사용하시면 됩니다.

단순 Count가 아니라 stl의 항목이 필요해서 조인하는 거라면?
조인조건을 주었는데도 왜 중복이 발생하는지?
조인조건을 빠트린것은 없는지 확인하세요.

잘못이 없는데도 중복이 나온다면?
stl의 조회에 필요한 항목 또한 여러개일수밖에 없지 않나요?
여러개 중 하나만 조회한다는 것은 애매모호한 말입니다.
키값은 중복이라도 조회해야 할 항목은 중복이 아닐수 있겠죠.
그중 어떤걸 선택해야 하는지는 쿼리작성의 문제가 아니라
업무적으로 판단해야 할 문제입니다.

by 知音 [2010.09.03 15:29:20]
SELECT COUNT(distinct STL.RCP_REQ_DT||STL.RCP_REQ_SEQ)
FROM TGTR_FEE_RCP_REQ RCP
, TGCM_EMP EMP
, TGTR_FEE_STL_DTL STL
WHERE EMP.EMP_NO = RCP.EMP_NO
AND (RCP.RCP_REQ_DT = STL.RCP_REQ_DT AND RCP.RCP_REQ_SEQ = STL.RCP_REQ_SEQ)
AND (RCP.MGT_BRNNO = :mgt_brnno OR :mgt_brnno IS NULL)
AND RCP.EMP_NO = :emp_no
AND RCP.RCP_REQ_DT BETWEEN :inq_dt_fr AND :inq_dt_to
AND (RCP.PROC_ST = :st OR :st IS NULL)

by 색즉시공 [2010.09.06 11:42:58]
SELECT COUNT(DISTINCT RCP.EMP_NO || RCP.RCP_REQ_DT || RCP.RCP_REQ_SEQ )
.....
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입