안녕하세요
쿼리를 연습해보고 있는 학생입니다.
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로 변경하려면 어떤식으로 쿼리를 작성해야 할까요?
○ merge into 로 변경?
- 변경 가능한데 꼭 merge into 를 써야 하는 건 아닙니다.
- update 를 이용해도 되고요
○ 기존 항목을 널로 변경?
- 널 가능 항목이라면 가능하긴 한데
- 다만, 널로 변경할 필요가 있는지는 의문입니다.
○ 쿼리 작성 방법을 물었는데..
- 정보가 부족합니다.
- 값을 어떻게 바꿀 건지?
- 정해진 값이 있는 건지?
- 정해진 규칙이 있는 건지?
○ 테이블에 제약은 설정되어 있나요?
1. UNIQUE 를 보장하기 위해
- UNIQUE CONSTRAINT 또는 UNIQUE INDEX 가 설정되어 있는지?
2. 1,2,3,4 만 입력받기 위해
- CHECK 제약이 설정되어 있는지?
3. NULL 입력
- 가능/불가능 ?
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처리가 되어있습니다.
-- 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 ;