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) ;
이건 구문 문제가 아니라 데이터 문제죠.
다중 코드가 검색되는 자료 우선 조회 확인하시구요.
이 자료들를 어떻게 처리할지 결정하셔야 합니다.
공통 적인 선별 기준이 마련된다면?
- 쿼리에 공통 조건을 줌으로써 해결 가능하구요.
공통적인 조건이 없이 개별로 선택해야 한다면?
- 일단 다중검색 자료 제외하고 전체 일괄 업데이트 한후
- 다중 검색 자료는 일일이 개별로 업데이트 해야할 것입니다.
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 ;
제가 말을 잘 못했던것 같군용 ㅎㅎㅎ 코드 테이블에는 중복되는 데이터 없이 관리 되고있구요
문서 관리쪽에 부서명만 저장 되어있고 부서 코드는 저장 되어 있지 않은 상태라 문서 관리 쪽
테이블 부서명 = 부서 코드 관리 테이블 부서명이 같은 경우에 부서 코드 관리테이블의
부서 코드를 문서 관리 테이블의 부서 코드로 업데이트 할 수 있을까? 라고 생각 했었습니다.
지금 구조상으로는 공통 적인 선별 기준은 없구요 이건 뭐 전산실에서 알아서 하겠죠??ㅎㅎㅎ
다만 좀 궁금해서 여쭤봤습니다.(뜻밖의 새로운 함수를 알게되서 좋네요 ㅎㅎㅎWM_CONCAT
저는 11G라 검색해보니 LISTAGG랑 유사하다고 하는군요)