오라클 쿼리를 짜고 있는데
merge into 구문을 사용하려고합니다.
조건에 의해서 값을 update하는 것까지는 문제없이 쿼리를 짰는데
조건에 의해서 뽑힌 로우들의 *이라는 컬럼 값이 + "1"인 로우들도 함께 update를 하려면 어떻게 해야하나요?
예를 들어, 조건에 의해서 a, b, c라는 값이 뽑혔고 해당 로우들이 update 되었습니다.
그러면 a1인 로우는 a의 값으로, b1이라는 로우는 b의 값으로, c1이라는 로우는 c의 값으로 함께 update를 하고싶은데
어떻게 쿼리를 짜야할까요?ㅠㅠㅠ
merge도 union할 수 있는 방법이 있나요?
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
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' ;
변경 구문을 바로 만들기 보다는
조회 구문부터 만들어 최종 결과 확인이 완료된 이후에
조회 구문을 변경 구문으로 바꾸는 게 좋습니다.
-- 갱신 대상 확인 -- 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 ;
네 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));
아! 혹시?
'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) ) ;