오라클 merge 0 9 2,181

by 오라클클 [SQL Query] merge 오라클 [2018.11.12 17:48:14]


오라클 쿼리를 짜고 있는데

merge into 구문을 사용하려고합니다.

조건에 의해서 값을 update하는 것까지는 문제없이 쿼리를 짰는데

조건에 의해서 뽑힌 로우들의 *이라는 컬럼 값이 + "1"인 로우들도 함께 update를 하려면 어떻게 해야하나요?

예를 들어, 조건에 의해서 a, b, c라는 값이 뽑혔고 해당 로우들이 update 되었습니다.

그러면 a1인 로우는 a의 값으로, b1이라는 로우는 b의 값으로, c1이라는 로우는 c의 값으로 함께 update를 하고싶은데

어떻게 쿼리를 짜야할까요?ㅠㅠㅠ

merge도 union할 수 있는 방법이 있나요?

by 마농 [2018.11.12 17:54:54]

작성하신 구문을 보여주세요.


by 오라클클 [2018.11.13 09:33:29]

MERGE INTO EMPLOYEE E
USING ( SELECT COMPANY_NO, RNUM FROM ( SELECT COMPANY_NO, ROWNUM AS RNUM FROM COMPANY ) WHERE RNUM BETWEEN 1 AND 100 ) C
ON ( E.COMPANY_NO = C.COMPANY_NO AND E.RANK = 'S1')
WHEN MATCHED THEN
UPDATE SET E.RANK = 'S2';

 

ON조건에 해당하는 값이 1234567회사와 4567890회사가 있고, 1234567값을 가진 회사는 A1234567 값도 가지고 있습니다.
이 때 1234567만 S2로 바꾸는게 아니라 A1234567도 S2로 바꾸고 싶습니다ㅠㅠ

두번 merge를 해야하나요?

E.COMPANY_NO = 1234567 / A1234567
E.COMPANY_NO = 4567890


by 마농 [2018.11.13 09:20:00]
MERGE INTO t_target a
USING t_source b
-- ON (a.id = b.id)
ON (a.id IN (b.id, b.id||'1'))
WHEN MATCHED THEN
UPDATE a.c1 = b.c1
;

 


by 마농 [2018.11.13 11:39:00]
MERGE INTO employee e
USING (SELECT *
         FROM (SELECT company_no
                    , ROWNUM AS rnum
                 FROM company
                WHERE ROWNUM <= 100     -- 조건절 추가(성능향상)
               )
        WHERE rnum BETWEEN 1 AND 100
       ) c
   ON ( -- e.company_no = c.company_no  -- 조건절 변경
        e.company_no IN (c.company_no, 'A' || c.company_no)
  AND   e.rank = 'S1'
       )
WHEN MATCHED THEN
UPDATE SET e.rank = 'S2'
;

 


by 오라클클 [2018.11.13 11:44:01]

A1234567과 같이 'A' || c.company_no 값에는 RANK가 S1이 아닐 수도 있는데 다음과 같이 조건을 주어도 

결과값이 올바르게 나오나용????ㅠㅠ


by 마농 [2018.11.13 12:17:17]

변경 구문을 바로 만들기 보다는
조회 구문부터 만들어 최종 결과 확인이 완료된 이후에
조회 구문을 변경 구문으로 바꾸는 게 좋습니다.
 

-- 갱신 대상 확인 --
SELECT c.company_no
     , e.company_no
     , e.rank
  FROM employee e
     , (SELECT *
          FROM (SELECT company_no
                     , ROWNUM AS rnum
                  FROM company
                 WHERE ROWNUM <= 100     -- 조건절 추가(성능향상)
                )
         WHERE rnum BETWEEN 1 AND 100
        ) c
 WHERE e.company_no IN (c.company_no, 'A' || c.company_no)
   AND e.rank = 'S1'
 ORDER BY c.company_no, e.company_no
;

 


by 오라클클 [2018.11.13 14:10:40]

네 SELECT 문은 다음과 같이 짰는데 ㅠㅠ 이걸 MERGE로 바꾸려니 어떻게 해야할지를 모르겠어요 ㅠㅠ

SELECT E.COMPANY_NO, E.RANK FROM EMPLOYEE E, 
                                 (SELECT * FROM (SELECT COMPANY_NO, ROWNUM AS RNUM FROM COMPANY WHERE ROWNUM <= 100)
                                  WHERE RNUM BETWEEN 1 AND 100) C
WHERE (E.COMPANY_NO = C.COMPANY_NO AND E.RANK = 'S1')
UNION ALL
SELECT E2.COMPANY_NO, E2.RANK FROM EMPLOYEE E2
WHERE E2.COMPANY_NO IN (
    SELECT 'A' || E.COMPANY_NO FROM EMPLOYEE E, 
                                 (SELECT * FROM (SELECT COMPANY_NO, ROWNUM AS RNUM FROM COMPANY WHERE ROWNUM <= 100)
                                  WHERE RNUM BETWEEN 1 AND 100));


by 마농 [2018.11.13 15:10:10]

쉽게 알려드렸는데 왜 어렵게 작성하셨나요?


by 마농 [2018.11.13 15:24:01]

아! 혹시?
'S1' 조건이 한쪽에만 적용되어야 하는 건가 보네요?
 

-- 갱신 대상 확인 --
SELECT c.company_no
     , e.company_no
     , e.rank
  FROM employee e
     , (SELECT *
          FROM (SELECT company_no
                     , ROWNUM AS rnum
                  FROM company
                 WHERE ROWNUM <= 100
                )
         WHERE rnum BETWEEN 1 AND 100
        ) c
-- OR 조건 활용
 WHERE e.company_no IN (c.company_no, 'A'||c.company_no)
   AND (e.rank = 'S1' OR SUBSTR(e.company_no, 1, 1) = 'A')
;
-- OR 조건 활용
 WHERE (e.company_no = c.company_no AND e.rank = 'S1')
    OR (e.company_no = 'A'||c.company_no)
;
-- e.rank 에 null 이 없다고 가정하면 이렇게도 가능
 WHERE (e.company_no, e.rank) IN ( (     c.company_no, 'S1'  )
                                 , ('A'||c.company_no, e.rank)
                                 )
;

 

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