UPDATE 쿼리 질문 드립니다 0 6 2,536

by DONKEY [SQL Query] UPDATE [2016.05.18 09:48:30]


A(문서 관리 테이블)테이블과 B(부서 코드 관리 테이블)테이블의

DEPT_NM이 같은 로우에 한해서

A테이블의 DEPT_CD에 B테이블의 DEPT_CD값을 넣어 줘야된다.

하지만 A테이블과 B테이블의 DEPT_NM이 PK값이 아니라서 단일 행을 반환하지 못해 에러가 납니다..

그래서 SET절의 서브쿼리에서 다중행이 발생합니다..

PK가 아닌 값을 비교해서 B테이블에 있는 DEPT_CD값을 A테이블에 DEPT_CD값에 넣을수 있을까요?

참고로 A테이블에 DEPT_CD 값은 모두 널입니다.

UPDATE MET_DOC_MGT A
    SET DOC_DEPT_CD = (SELECT B.DEPT_CD
                         FROM OCS.ZMM_DEPT B
                        WHERE TRIM(A.DOC_DEPT_NM) = TRIM(B.DEPT_NM)
                     GROUP BY B.DEPT_CD)
  WHERE DOC_YY = '2015'
    AND EXISTS(SELECT 1
                FROM OCS.ZMM_DEPT B
               WHERE TRIM(A.DOC_DEPT_NM) = TRIM(B.DEPT_NM)
            GROUP BY B.DEPT_CD)
 ;

 

by 우리집아찌 [2016.05.18 09:51:19]

MAX , MIN 사용하셔도 되는데 그건 DEPT_CD 가 똑같다는 조건이 있어야할것 같네요.

 


by DONKEY [2016.05.18 10:00:27]

AS-IS에서는 부서를 코드로 관리 안하고 있어..서 조건을 작성하기가 좀 곤란한 상황입니다 ㅜㅜ(해결해야될 문제는 아닌데 이런식으로 업데이트도 가능할까?? 궁금해서 질문 드렸습니다ㅎㅎㅎ)


by 마농 [2016.05.18 10:15:56]

이건 구문 문제가 아니라 데이터 문제죠.
다중 코드가 검색되는 자료 우선 조회 확인하시구요.
이 자료들를 어떻게 처리할지 결정하셔야 합니다.
공통 적인 선별 기준이 마련된다면?
  - 쿼리에 공통 조건을 줌으로써 해결 가능하구요.
공통적인 조건이 없이 개별로 선택해야 한다면?
  - 일단 다중검색 자료 제외하고 전체 일괄 업데이트 한후
  - 다중 검색 자료는 일일이 개별로 업데이트 해야할 것입니다.
TO-BE 시스템 개발 중이시라면?
  - 코드 테이블을 정비하여 다중데이터를 제거하시는게 정답입니다.

SELECT TRIM(b.dept_nm) dept_nm
     , wm_concat(b.dept_cd) dept_cd
  FROM met_doc_mgt a
     , ocs.zmm_dept b
 WHERE TRIM(a.doc_dept_nm) = TRIM(b.dept_nm)
 GROUP BY TRIM(b.dept_nm)
HAVING COUNT(*) > 1
;

 


by DONKEY [2016.05.18 10:43:57]

제가 말을 잘 못했던것 같군용 ㅎㅎㅎ 코드 테이블에는 중복되는 데이터 없이 관리 되고있구요

문서 관리쪽에 부서명만 저장 되어있고 부서 코드는 저장 되어 있지 않은 상태라 문서 관리 쪽

테이블 부서명 = 부서 코드 관리 테이블 부서명이 같은 경우에 부서 코드 관리테이블의

부서 코드를 문서 관리 테이블의 부서 코드로 업데이트 할 수 있을까? 라고 생각 했었습니다. 

지금 구조상으로는 공통 적인 선별 기준은 없구요 이건 뭐 전산실에서 알아서 하겠죠??ㅎㅎㅎ

다만 좀 궁금해서 여쭤봤습니다.(뜻밖의 새로운 함수를 알게되서 좋네요 ㅎㅎㅎWM_CONCAT

저는 11G라 검색해보니 LISTAGG랑 유사하다고 하는군요)


by 마농 [2016.05.18 10:47:32]

코드는 당연히 중복이 없겠지요?

지금 중복되는 것은 코드명입니다.

코드는 다르나 코드명이 중복되는 거죠.


by DONKEY [2016.05.18 11:06:46]

아,,,ㅋㅋㅋ 주로 테스트에 사용하던 부서들이 이름이 안겹치길래 PK는 아니라도 중복되는게 없구나라고 그냥 아무생각도없이 그렇게 생각하고있었네유 LISTAGG 사용해서 검색해보니 진료실1~6까지 엄청많네요 감사합니당

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