쿼리질문입니다. 0 6 1,593

by BadGod [SQL Query] [2016.05.13 15:50:31]



초보라 잘 몰라서 질문 올립니다.
친절한 답변 기다리며서
오늘도 행복한 하루되세요~^^

1) 상황:
그림1처럼 - CUST_TBL, MGR_TBL 두개의 테이블이 있습니다.
         CUST_TBL 에는 계좌번호 컬럼이 두개(ACUNT1, ACUNT2) 있고,
         MGR_TBL 에는 계좌번호 컬럼이 세개(ACUNT3, ACUNT4, ACUNT5) 있습니다.

2) 질문:
그림3의 계좌번호 데이타와 그림1의 ACUNT1~ACUNT5 컬럼의 데이터 계좌번호를 비교해서,
같은 계좌가 있으면 ACUNT1~ACUNT5 컬럼의 계좌번호앞에 "^^"를 삽입하는 것입니다(그림3 참조).
*ACUNT1~ACUNT5 컬럼의 데이터 계좌번호 뒤에는 한글문자도 포함 된 경우도 있습니다.
*ACUNT1~ACUNT5 컬럼 중에는 NULL도 존재합니다.
*CUST_TBL, MGR_TBL의 데이터는 계속 증가 합니다.
* 토드에서 작업할 예정인데, 완전한 실행 문을 부탁드립니다.


3) 예,
   그림3의 ACUNT 컬럼에 있는 "888-888"이 들어 있는 ACUNT1~ACUNT5 컬럼을 비교 했더니
    MGR_ID M3,M4,M5의 ACUNT4컬럼에 같은 데이터가 있어서,
                          M3의 ACUNT4 컬럼의 데이터 "888-888 참고"  ---> "^^888-888 참고" 로
                          M3의 ACUNT4컬럼의 데이타  "888-888"    ---> "^^888-888"로
                          M3의 ACUNT4컬럼의 데이타   "888-888"    ---> "^^888-888"로
      변환된 예입니다.

by 랑에1 [2016.05.13 16:07:17]
UPDATE CUST_TBL1 a 
       SET a.ACUNT1 = 
       (SELECT '^^' || ACUNT
         FROM 그림3테이블 
        WHERE ACUNT = a.ACUNT1
       ) 
 WHERE a.ACUNT1 IN 
       (SELECT ACUNT 
         FROM 그림3테이블
        WHERE ACUNT = a.ACUNT1 
       )

이런식으로 1~5번까지 다섯번 돌려주면 될 것 같은데요.

더 멋진답은 다음분이 올려주실 겁니다 ㅎㅎ

 


by BadGod [2016.05.13 17:38:23]

답변에 감사합니다.

5개가 아니라 더 많다면 어떻게 하는게 좋을가요?

이를테면 1천개 이상이라면요....

답변 기다리겠습니다.

 

꾸벅...^^


by 우리집아찌 [2016.05.13 18:12:20]

5개로우가 아니라 5개 컬럼이란 말씀같네요.

그리고 한번에 두개의 테이블에 UPDATE 는 불가능합니다.

최소 두개 쿼리 되겠네요.

양이 많으시면 프로시져로 구현하시는게 좋을것같아요.

아마 500~1000개 단위로 COMMIT 하시던가 해야할겁니다.

 

 


by BadGod [2016.05.14 06:26:48]

감솨합니당.^^


by 마농 [2016.05.16 08:28:29]
WITH cust_tbl AS
(
SELECT 'C1' cust_id, '111-111' acunt1, '' acunt2 FROM dual
UNION ALL SELECT 'C2', '111-111 사용안함', '555-555' FROM dual
UNION ALL SELECT 'C3', '000-000', '' FROM dual
UNION ALL SELECT 'C4', '111-222', '' FROM dual
UNION ALL SELECT 'C5', '222-222', '' FROM dual
)
, mgr_tbl AS
(
SELECT 'C1' cust_id, 'M1' mgr_id, '222-222' acunt3, '333-333' acunt4, '' acunt5 FROM dual
UNION ALL SELECT 'C1', 'M2', '', '444-444', '' FROM dual
UNION ALL SELECT 'C2', 'M1', '666-666 사용안함', '', '' FROM dual
UNION ALL SELECT 'C2', 'M2', '777-777', '', '' FROM dual
UNION ALL SELECT 'C2', 'M3', '', '888-888 참고', '' FROM dual
UNION ALL SELECT 'C2', 'M4', '', '888-888', '999-999' FROM dual
UNION ALL SELECT 'C2', 'M5', '', '888-888', '999-999' FROM dual
UNION ALL SELECT 'C3', 'M1', '', '', '' FROM dual
UNION ALL SELECT 'C3', 'M2', '', '', '' FROM dual
UNION ALL SELECT 'C4', 'M1', '111-222', '111-333', '' FROM dual
UNION ALL SELECT 'C5', 'M1', '111-444', '', '' FROM dual
)
, acunt_tbl AS
(
SELECT '888-888' acunt FROM dual
UNION ALL SELECT '999-999' FROM dual
UNION ALL SELECT '222-222' FROM dual
UNION ALL SELECT '111-111' FROM dual
UNION ALL SELECT '555-555' FROM dual
UNION ALL SELECT '111-999' FROM dual
UNION ALL SELECT '111-333' FROM dual
)
SELECT c.cust_id
     , m.mgr_id
     , NVL2(a1.acunt, '^^', '') || c.acunt1 acunt1
     , NVL2(a2.acunt, '^^', '') || c.acunt2 acunt2
     , NVL2(a3.acunt, '^^', '') || m.acunt3 acunt3
     , NVL2(a4.acunt, '^^', '') || m.acunt4 acunt4
     , NVL2(a5.acunt, '^^', '') || m.acunt5 acunt5
  FROM cust_tbl c
 INNER JOIN mgr_tbl m ON c.cust_id = m.cust_id
  LEFT OUTER JOIN acunt_tbl a1 ON INSTR(c.acunt1, a1.acunt) > 0
  LEFT OUTER JOIN acunt_tbl a2 ON INSTR(c.acunt2, a2.acunt) > 0
  LEFT OUTER JOIN acunt_tbl a3 ON INSTR(m.acunt3, a3.acunt) > 0
  LEFT OUTER JOIN acunt_tbl a4 ON INSTR(m.acunt4, a4.acunt) > 0
  LEFT OUTER JOIN acunt_tbl a5 ON INSTR(m.acunt5, a5.acunt) > 0
;

 


by BadGod [2016.05.16 17:40:04]

마농님,

진심으로 대단하십니다.

감솨합니다.^^

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