오라클 1:N인 관계에서 Update Join질문드립니다. 0 8 880

by SQL모험가 [Oracle 기초] [2021.08.07 19:40:23]


부서명 부서코드
총무부 A1
경리부 B1
영업부 C1

A 테이블

사원번호 부서명
1 총무부  
2 경리부  
3 총무부  
4 영업부  
5 경리부  
6 총무부  
7 경리부  
8 영업부  
9 총무부  
10 경리부  
   

B테이블

 

헷갈려서 질문드립니다.

하고자 하는것은 B테이블의 부서명 컬럼이 부서코드로 변경될 예정입니다.

때문에 B테이블의 부서명을 A테이블을 참조해서 부서코드로 일괄 변경하려 합니다.

A와 B테이블의 부서명 관계가 1:N인 관계로 GROUP BY로 해서 중복을 제거하고 조인한 다음 UPDATE하면 되리라 생각했는데;

UPDATE B
SET (B.부서명)
= (SELECT A.부서코드 FROM A WHERE A.부서명 = B.부서명 GROUP BY A.부서명)
WHERE EXISTS (
    SELECT 'x' FROM A WHERE A.부서명 = B.부서명 GROUP BY A.부서명
)

-->ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다. 

라고 리턴이 되어서요

조인한 다음 GROUP BY 해서 하나의 부서명에 대해 부서코드는 중복되지 않으리라 생각했는데..

코드를 계속 들여다 보고 있습니다만 잘 모르겠습니다.

GROUP BY를 다른데 써줘야 할까요?

오라클 11g입니다

by pajama [2021.08.08 11:01:55]

중복 제거를 안해도 되지 않을까요..?

update 테이블B b
set b.부서명= (select a.부서코드 from 테이블A a where a.부서명 = b.부서명)

 


by SQL모험가 [2021.08.08 14:14:08]

중복제거를 했던 이유가.. 그냥 그대로 하니까 단일 행 하위 질의에 2개이상의 행이 리턴되었습니다 저게 나오더라구요 ㅠ


by pajama [2021.08.08 23:10:03]

A테이블에 같은 부서명인데 부서코드가 다른 경우가 있는건 아닌지요?


by SQL모험가 [2021.08.09 09:50:12]

설마 부서코드에서 중복이라.. 혹시 모르니 확인 해볼게요


by SQL모험가 [2021.08.09 10:10:54]

네 제가 바보였습니다..

저기 올린 부서코드의 경우 실제로는 좀 복잡한 값으로 되어있는데 앞부분만 보고 중복 없겠지 한 제가 바보였습니다 ㅠ

데이터 넣으신 분이 실수 하셨더라구요..

제대로 살폈어야 하는데; 답변주셔서 감사합니다.


by 마농 [2021.08.09 09:22:37]

중복이 되는 것을 SQL 로 해결하는게 아닙니다.
별도로 수작업으로 중복의 원인을 찾아 제거해야 합니다.
우선 다음 쿼리를 실행하여 중복된 코드들을 찾고 이를 어떻게 해결할지 고민하셔야 합니다.
 

SELECT 부서명
     , LISTAGG(부서코드, ',') WITHIN GROUP(ORDER BY 부서코드) 부서코드들
  FROM A
 GROUP BY 부서명
HAVING COUNT(*) > 1
;

 


by SQL모험가 [2021.08.09 09:53:29]

말씀하신건 A 부서코드 테이블에서 중복된 값을 찾아란 말씀이신가요?


by SQL모험가 [2021.08.09 10:11:14]

맞네요 덕분에 찾았습니다 어느게 문제인가 했더니 ㅠ

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