Merge into로 이런게 가능할까요? 0 7 693

by Driver [Oracle 기초] 오라클 쿼리 [2020.10.07 16:52:24]


안녕하세요

쿼리를 연습해보고 있는 학생입니다.

Merge into 기능에 대한건데요

 

Col1 |  Col2 |  Col3

------‐---------------------------

 a     |     b    |      1

 c     |     d    |      2

 e     |     f     |      3

 g     |     h    |      4

.....

...

이런식으로 내려가는 표를 Merge into 함수를 이용해 Col3의 데이터를 수정하려고 합니다.

Col1, Col2에서의 변경은 없고 Col1은 PK이고 ,Col3는 현재 Unique 제약이 걸려있어 중복된 데이터는 들어갈 수 없구요.

Col3의 데이터의 값은 1,2,3,4 네가지만 들어갈 수 있습니다

만약에 제가 Merge into를 이용하여 Col3의 값을 변경한다고 할때 기존에 저장되어있던 값을 NULL로 변경하려면 어떤식으로 쿼리를 작성해야 할까요?

by ㅇㅇ준 [2020.10.07 16:54:51]

그냥 업데이트하면되는거 아닌가요??;;

공부를 위한 것이라면 가능은하겠습니다 
merge 
using을 사용하면 가능하겠습니다


by Driver [2020.10.07 21:58:13]

ㅎㅎ 맞습니다 그냥 업데이트로도 해결이 되는 단순한 문제긴 한데

 

프로그램 상에서 업데이트로만 처리하려니 약간 번거로워지는 문제가 발생해서요 

 

답변 감사합니다 ^^


by 마농 [2020.10.07 17:15:32]

○ merge into 로 변경?
 - 변경 가능한데 꼭 merge into 를 써야 하는 건 아닙니다.
 - update 를 이용해도 되고요
○ 기존 항목을 널로 변경?
 - 널 가능 항목이라면 가능하긴 한데
 - 다만, 널로 변경할 필요가 있는지는 의문입니다.
○ 쿼리 작성 방법을 물었는데..
 - 정보가 부족합니다.
 - 값을 어떻게 바꿀 건지?
 - 정해진 값이 있는 건지?
 - 정해진 규칙이 있는 건지?

○ 테이블에 제약은 설정되어 있나요?
1. UNIQUE 를 보장하기 위해
 - UNIQUE CONSTRAINT 또는 UNIQUE INDEX 가 설정되어 있는지?
2. 1,2,3,4 만 입력받기 위해
 - CHECK 제약이 설정되어 있는지?
3. NULL 입력
 - 가능/불가능 ?


by Driver [2020.10.07 22:06:55]
Col1 Col2 Col3
Data1 A 1
Data2 B 2
Data3 C 3
Data4 D 4
Data5 E NULL

위의 표와같은 형태로 데이터를 우선 조회하게 됩니다. 

물론 실 데이터는 저것보단 훨씬 많구요. 

Q. 값을 어떻게 바꿀 건지?

A. 예를들어 Col1의 Data5에게 '1'이라는 값을 입력하게 되면 기존 '1'을 가지고 있던 Data1의 Col3 값이 Null로 바뀌어야 합니다. 

Q. 정해진 값이 있는건지?

A. 제가 편의상 1,2,3,4로 표현한 값들은 정해져 있고, 이 값은 고정입니다.

Q.정해진 규칙이 있는건지?

A.정해진 규칙은 별도로 존재하지 않습니다. 사용자가 그때그때 변경할 수 있어야 하거든요.

Q. 테이블 제약문제

A1. 이 부분은 제가 미처 확인을 안했네요. 내일 확인토록 하겠습니다.

A2. CHECK 제약은 프로그램 상에서 입력값이 1,2,3,4 이외의 값은 입력할 수 없도록 지정해 두었습니다. 

A3. 이게 사실 가장 큰 문제인데, 1,2,3,4 이외는 전부 NULL처리가 되어있습니다.  


by 마농 [2020.10.08 08:12:56]
-- 1. Update 전에 동일한 형태의 Select 구문을 실행하여 갱신 대상을 우선 확인하는 습관 필요.
SELECT col1
     , col3
     , NVL2(col3, NULL, 1) col3_new
  FROM t
 WHERE col1 = 'Data5'
    OR col3 = 1
;
-- 2. Update
UPDATE t
   SET col3 = NVL2(col3, NULL, 1)
 WHERE col1 = 'Data5'
    OR col3 = 1
;
-- 3. MERGE
MERGE INTO t a
USING
(
SELECT col1
     , NVL2(col3, NULL, 1) col3
  FROM t
 WHERE col1 = 'Data5'
    OR col3 = 1
) b
ON (a.col1 = b.col1)
WHEN MATCHED THEN
SET a.col3 = b.col3
;

 


by Driver [2020.10.08 08:59:54]

감사합니다 마농님 ^^ 

 

늘 댓글에서 많이 배우고 있습니다.

좋은 하루 되시고 즐거운 연휴 되세요 (__)


by 마농 [2020.10.08 08:58:44]

col3 가 NULL 인 경우에 대한 답변을 드렸는데.
혹시? col3 가 값을 가지고 있는 상태에서 갱신이 가능하다면?
NVL2 대신 DECODE 나 CASE 문을 이용하셔야 하겠네요.
 

-- 예) 3 을 가진 Data3 를 1 로 변경하는 경우
UPDATE t
   SET col3 = DECODE(col1, 'Data3', 1)
 WHERE col1 = 'Data3'
    OR col3 = 1
;

 

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