join update하는 쿼리 질문 드립니다. 0 8 3,532

by 성이 join update [2014.09.02 15:17:22]


EDU_TARGET_T 테이블에는 8만개 정도의 정보가 있고
M_DATA 테이블에는 13만개 정도의 정보가 있습니다.
 
 
 
위에 두 테이블이 있습니다.  두테이블의 SIDO, GUGUN, COM_NAME, NAME, BIRTHDAY 의 컬럼을 비교해서
같으면 M_DATA테이블의 REQ_NO의 값을 EDU_TARGET_T 테이블의 REQ_TEMP 컬럼에 넣는겁니다.
그래서 
 
update /*+ bypass_ujvc */
(SELECT B.REQ_TEMP AS REQ_TEMP, A.REQ_NO AS REQ_NOA
FROM EDU_TARGET_T B, m_data A 
WHERE B.SIDO=A.SIDO AND B.GUGUN=A.GUGUN AND B.COM_NAME=A.COM_NAME AND B.NAME=A.NAME AND B.BIRTHDAY=A.BIRTHDAY)
SET REQ_TEMP=REQ_NOA
 
이런식으로 했는데 ORA-01779 오류가 납니다.
 
그래서 서브쿼리 방식으로 업데이트 하는걸 찾아서 했는데..
문제는 EDU_TARGET_T 테이블에 SIDO, GUGUN, COM_NAME, NAME, BIRTHDAY의 정보가 같은 사람이 하나씩 있으면 
좋은데 같은 정보가 2개 이상인 사람이 몇천명이 되더군요..
 
그리니 두 테이블 조인해서 정보가 같은걸 넣을려고 해도  EDU_TARGET_T 테이블에 정보가 두개이상 나오니 
단일행 에러? 가 나더라구여 한마디로 동인인물의 정보가 한테이블에 여러게 있다는 겁니다
 
여기저기 알아보니 배치 돌려라.. 자바단에서 해라 하는데..
상식적으로 뭐~ 두개 비교해서 정보가 같으면 그냥 다 업데이트 하면 될듯한데.. 이게 생각만큼 제대로 안됩니다 ㅠㅠ
 
해본적도 없는데 어떻게 해야하는건가요.. 좋은 방법이나 예시 같은거좀 부탁 드려도 될런지요
 
환경은 제우스 + 오라클9I + 윈도2003 서버입니다.
스프링이나 그런 프레임워크는 사용 안하구요.
 
한마디로 두개의 테이블 조인해서 조건이 맞으면 한테이블에 정보를 업데이트 하는건데..
유니크한 값은 없고 여러개의 컬럼을 비교해서 update해야하는데 업데이트 해야 할 테이블에 동일정보가 중복으로 
들어가 있는 상황입니다.
 
 
by DJ [2014.09.02 15:50:55]
update EDU_TARGET_T B
   set B.REQ_TEMP = 
   (select A.REQ_NO 
      from M_DATA A
    where  B.SIDO=A.SIDO 
       AND B.GUGUN=A.GUGUN 
       AND B.COM_NAME=A.COM_NAME 
       AND B.NAME=A.NAME 
       AND B.BIRTHDAY=A.BIRTHDAY)
  where exists ( select 1
                          from M_DATA A 
                        where  B.SIDO=A.SIDO 
                           AND B.GUGUN=A.GUGUN 
                           AND B.COM_NAME=A.COM_NAME 
                           AND B.NAME=A.NAME AND B.BIRTHDAY=A.BIRTHDAY);

위 쿼리 한번 수행해 보세요. 실제 위와 같은 방식으로 작업한적이 있는데 잘 돌아갈지는 모르겠네요.

 


by 성이 [2014.09.02 16:06:19]

답변 정말 감사합니다.. 실행 해 보니 에러는 안나는데 계속 돌아가기만 하네요;;

5분정도 보다 계속 돌아가서 일단 중지 했습니다..

8만건 짜리랑 13만건짜리 비교해서 하느라 시간이 많이 걸리는걸까요?;;;


by 비주류 [2014.09.02 15:52:57]
MERGE INTO edu_target_t b
USING m_data a
ON (
        B.SIDO=A.SIDO
    AND B.GUGUN=A.GUGUN
    AND B.COM_NAME=A.COM_NAME
    AND B.NAME=A.NAME
    AND B.BIRTHDAY=A.BIRTHDAY)
WHEN MATCHED THEN
    UPDATE SET b.req_temp = a.req_no

 


by 성이 [2014.09.02 16:07:25]

답변 감사드립니다..

그린더 실행해보니 ORA-00905: missing keyword 이런 메세지가 나오네요 ㅠㅠ


by DJ [2014.09.02 16:13:19]

한건 처리할때마다 full scan 하지 않을까 합니다.

where 절에 해당 column 들에 index 만든후에 작업하시면 빨라질 것 같네요.


by 성이 [2014.09.02 16:45:15]

아~ 감사합니다..

인덱스 생성해서 해보겠습니다 ^^


by 마농 [2014.09.02 16:34:38]

1. 동일 중복 건에 대한 중복제거 기준 정립이 필요합니다.
  - SQL 작성 이전에 기준정립이 우선입니다.
2. 9i 의 Merge 구문은 구문 생략이 불가하므로 다 적어 줘야 합니다.
  - 따라서 Not Matched 구문도 적어줘야 하는데
  - 이구문을 안타게 하기 위해서는 Using 절에서 미리 해당 자료를 제거해줘야 합니다.
  - 즉 Matched 만 타도록 Using 절을 만들어 주세요.

MERGE INTO edu_target_t b
USING
(
SELECT b.ROWID       AS rid
     , MIN(a.req_no) AS req_no
  FROM edu_target_t b
     , m_data       a
 WHERE b.sido     = a.sido
   AND b.gugun    = a.gugun
   AND b.com_name = a.com_name
   AND b.name     = a.name
   AND b.birthday = a.birthday
 GROUP BY b.ROWID
) a
ON (b.ROWID = a.rid)
WHEN MATCHED THEN
    UPDATE SET req_temp = a.req_no
WHEN NOT MATCHED THEN
    INSERT(req_temp) VALUES(a.req_no)
;

 


by 성이 [2014.09.02 16:47:03]

감사합니다..

으~~저같은 초보에건 너무나 어려운  쿼리네요 ㅠㅠ

적어주신 소스와 조언대로 해보겠습니다..

너무 감사드립니다.

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