Update문에 대해서 알려주세요(검색결과에 따른) 0 5 1,711

by 내일은 [SQL Query] 쿼리문 [2013.12.07 17:39:18]


처음으로 글을 올립니다.

sql쿼리에 대해서 자료를 찾아봐도 비슷한 내용의 것을 잘 찾지 못하겠네요.

질문내용은 다음과 같습니다.

전제조건 : Tbl_A의 고객CD와 기계번호가 중복된 데이터에 대해서 밑의 처리를 한다.
                Tbl_A와 Tbl_B의 상품CD, 서비스CD가 같은 것중에서
                Tbl_B의 우선순위가 낮은 데이터에 대해서 Tbl_A의 상태CD의 값을 「3」으로 갱신
    Tbl_A                                             Tbl_B
    고객CD    기계번호    상품CD    서비스CD    상태CD                    상품CD    서비스CD    우선순위
    C0001    G001            AA            S001            0                             AA            S001             100
    C0001    G001            BB            S002            0                        BB            S002               10
    C0001    G001            CC            S002            0                        CC            S002    20
    C0002    G002            CC            S003            0                        CC            S003               50

 -- 검색 SQL <=== 검색 쿼리도 자신이 없네요
 select A.고객CD, A.기계번호, MAX(B.우선순위)
 from Tbl_B B inner join Tbl_A A
 on A.상품CD = B.상품CD
 and A.서비스CD = B.서비스CD
 Group by A.고객CD, A.기계번호
 Order by B.우선순위 DESC

 --갱신 SQL <=== 문제가 되는 부분!!!
 update Tbl_A
 set 상태CD = '3'
 where 고객CD = 위 검색결과의 고객CD
 and 기계번호 = 위 검색결과의 기계번호
 and Tbl_B.우선순위 < 위 검색 에서 취득한 우선순위의 최대값
하나의 쿼리로 Update할 수 있는 방법이 있을까요?
간단한 질문이지만, 쿼리작성이 어렵게 느껴집니다.
아시는 분이 계시다면 알려주세요.

개발을 하고 있지만, 부끄러울 정도로 쿼리작성에 대해서 아직도 잘 모르겠네요.
좋은 강좌 등이 있다면 알려주시면 감사하겠습니다.

좋은 주말 잘 보내세요.
by 임상준 [2013.12.07 17:59:36]
merge 구문 어떻게 잘 쓰시면 될거같은데요?

by 내일은 [2013.12.07 22:12:56]
임상준님
댓글 감사합니다.
먼저 merge구문에 대해서 알아보도록 하겠습니다.

by 내일은 [2013.12.08 09:40:33]
임상준님..

제가 올린 질문내용중에서 
전제조건 마지막부분의 설명과 갱신sql의 조건이 잘못되어있었네요.

전제조건 마지막부분은 "Tbl_B의 우선순위"라는 조건이구요.
갱신 sql의 조건중 마지막의 "Tbl_A
.우선순위"가 아닌 "Tbl_B.우선순위" 였습니다.

새로이 질문을 올리려다가, 댓글로써 입력했습니다.
전제조건이 수정되었어도 Merge를 사용하면 되는지요?

같은 내용의 질문이 되어서 죄송합니다.

by 마농 [2013.12.09 08:35:16]
WITH Tbl_A AS
(
SELECT 'C0001' 고객CD, 'G001' 기계번호, 'AA' 상품CD, 'S001' 서비스CD, '0' 상태CD FROM dual
UNION ALL SELECT 'C0001', 'G001', 'BB', 'S002', '0' FROM dual
UNION ALL SELECT 'C0001', 'G001', 'CC', 'S002', '0' FROM dual
UNION ALL SELECT 'C0002', 'G002', 'CC', 'S003', '0' FROM dual
)
, Tbl_B AS
(
SELECT 'AA' 상품CD, 'S001' 서비스CD, 100 우선순위 FROM dual
UNION ALL SELECT 'BB', 'S002', 10 FROM dual
UNION ALL SELECT 'CC', 'S002', 20 FROM dual
UNION ALL SELECT 'CC', 'S003', 50 FROM dual
)
-- 갱신 대상 조회 SQL --
SELECT a.고객CD, a.기계번호
     , MIN(a.상품CD) KEEP(DENSE_RANK FIRST ORDER BY b.우선순위) 상품CD
     , MIN(a.서비스CD) KEEP(DENSE_RANK FIRST ORDER BY b.우선순위) 서비스CD
  FROM Tbl_A a
     , Tbl_B b
 WHERE a.상품CD = b.상품CD
   AND a.서비스CD = b.서비스CD
 GROUP BY a.고객CD, a.기계번호
HAVING COUNT(*) > 1
;
-- 갱신 SQL --
UPDATE Tbl_A
   SET 상태CD = '3'
 WHERE (고객CD, 기계번호, 상품CD, 서비스CD)
    IN (-- 갱신 대상 조회 SQL --
        SELECT a.고객CD, a.기계번호
             , MIN(a.상품CD) KEEP(DENSE_RANK FIRST ORDER BY b.우선순위) 상품CD
             , MIN(a.서비스CD) KEEP(DENSE_RANK FIRST ORDER BY b.우선순위) 서비스CD
          FROM Tbl_A a
             , Tbl_B b
         WHERE a.상품CD = b.상품CD
           AND a.서비스CD = b.서비스CD
         GROUP BY a.고객CD, a.기계번호
        HAVING COUNT(*) > 1
        )
;

by 내일은 [2013.12.09 22:42:36]
임상준님과 마농님께 감사드립니다

회사에서는 확인을 할 수없어서 이제서야 확인을 했습니다.

이틀동안 생각을 해도 답이 안나왔었던 부분이었습니다.
지인에게 물어도 봤지만 제 sql실력이 너무 형편없어서
이해가 안되기도 했구요.

웹쪽만 하다가 이번에 배치처리를 하면서
sql을 하니 쿼리만으로도 대부분의 처리가 가능하다는 것을 알게 되었습니다.

현재 sql에 대해서 알고 있는 것은 단순한 select, delete, update문이 전부 입니다.

이번 기회를 통해서 sql쿼리에 대해서 공부를 하려고 합니다만
어디부터 시작을 해야 될지가 막막하군요...
서브쿼리 작성이라든지 지금과 같은 update문이라든지...

좋은 자료나 책이 있으면 소개해 주셨으면 감사하겠습니다.
너무 원하기만 해서 죄송합니다만, 좋은 조언을 부탁드립니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입