이번에 요청을 받은 것은,
1. A, B, C라는 변수를 전달 받아 TABLE1에 업데이트를 한다.
2. TABLE2에 해당 데이터가 존재하지 않는다면 INSERT 한다.
라는 것을 요청 받았다.
실상 테이블을 이런식으로 설계를 하면 안되지만, 어쩔 수 없는 기획적인 또한
구조적인 사정이 있으니, 일단 가능한 방법을 찾아 보도록 했다.
이 경우 테이블2에 해당 변수가 존재하는지를 알아 볼려면 별도로
SELECT를 3번을 하고 INSERT를 최고 3번을 해야 한다.
좀더 간단히 할 수 있을 것 같다는 생각이 들었다.
SQL에서 배열을 사용할 수 있다면 이 변수를 하나의 배열에 넣고 LOOP를 돌면서
검사하고 INSERT를 할 수 있을꺼 같다. 과연 이런 형태가 가능한가?
일단 배열의 사용은 불가능하다. 이와 비슷한 형태로 만들 수 있는 것이 있는데,
이것이 바로 테이블변수를 활용하는 것이다.
사용 법은 다음과 같다.
DECLARE @테이블변수 TABLE(컬럼명 타입); 이런 형태인데,
EX) DECLARE @TEMP_TABLE TABLE(TEMP_ID INT);
한가지 의문이 테이블 변수와 스칼라 변수는 하나의 DECLARE에서 사용할 수 없었다는 것이다.
즉,
DECLARE @TEMP_TABLE TABLE(TEMP_ID INT)
, @V_VALUE INT;
이런식으로 사용은 안되고,
DECLARE @TEMP_TABLE TABLE(TEMP_ID INT);
DECLARE @V_VALUE INT;
이렇게 따로 해줘야 한다는 것이다.
이렇게 해 놓으면 다음과 같이 쭈욱 해줄 수 있다.
1. 변수에 삽입.
DECLARE @TEMP_TABLE TABLE(TEMP_ID INT);
INSERT INTO @TEMP_TABLE (TEMP_ID) VALUES (@A);
INSERT INTO @TEMP_TABLE (TEMP_ID) VALUES (@B);
INSERT INTO @TEMP_TABLE (TEMP_ID) VALUES (@C);
2. 테이블1 에 업데이트 하고
UPDATE TABLE1 SET A = @A, B = @B, C = @C WHERE 조건 = @조건;
3. 테이블2에 존재하지 않느다면 INSERT
MERGE INTO 테이블2 별칭1
USING @TEMP_TABLE 별칭2
ON 별칭1.조건 = 별칭2.조건
WHEN NOT MATCHED THEN
INSERT (ID) VALUES (별칭2.TEMP_ID);
업데이트는 필요없으니 빼고 삽입만~
일단 요구는 만족했으니... 끝~~~
'DataBase > SQL' 카테고리의 다른 글
[SQL] 컬럼에 제약 조건 추가. (0) | 2013.03.07 |
---|---|
[SQL] 인덱스 (클러스터, 비클러스터) 개념 (0) | 2013.02.26 |
[SQL] ALTER TABLE (0) | 2013.02.13 |
[SQL] SELECT INTO (임시 테이블 만들기) 사용법 (0) | 2013.02.13 |
[SQL] 동적쿼리 (0) | 2013.02.13 |