[MSSQL]SELECT INTO문을 통한 임시테이블 생성(SELECT INTO절)
서론
평소에 임시 테이블을 생성할 시 CREATE DDL문을 직접 작성하여 생성했었습니다. 그런데 다른 분이 작성하신 쿼리를 보고 SELECT INTO문으로도 임시 테이블을 간편히 생성할 수 있다는 것을 알게 되었습니다. 이를 계기로 정리하게 된 SELECT INTO문으로 임시 테이블을 생성하는 방법을 예제를 통해 알아볼까 합니다.
본론
[구문 형식]
SELECT [삽입할 컬럼1], [삽입할 컬럼2] ...
INTO [#임시 테이블명]
FROM [데이터를 가져올 테이블명]
[특징]
1. 임시 테이블을 DDL문을 작성하여 생성하지 않아도 생성 가능해서 편리합니다.
2. 생성과 동시에 조회한 데이터를 INSERT 할 수 있습니다.
3.SELECT INTO문으로 생성한 임시 테이블의 컬럼 타입은 FROM절의 테이블 컬럼 타입으로 복사가 됩니다.
4.FROM 절의 테이블이 인라인 뷰(Inline View) 일 경우 서브 쿼리에서 조회한 테이블 컬럼 타입이 임시 테이블에 복사가 됩니다. ([예제 1]의 INSERT문으로 확인 가능)
5. 서브 쿼리로 조회된 인라인 뷰에서 서브 쿼리 내부에 테이블이 없을 경우 데이터의 가장 MAX 길이인 타입으로 생성이 되는 것으로 추측됩니다. ([예제 2]의 INSERT문으로 확인 가능)
[제한사항]
SELECT 시 ORDER BY 해도 행이 정렬된 순서대로 들어가지 않으므로 주의가 필요합니다.(맨 아래 예제로 확인 가능)
[예제 1]
--테스트 임시 테이블 생성
CREATE TABLE #TEMP_SCORE_TABLE(
CLASS NVARCHAR(06)
,SCORE INT
)
INSERT INTO #TEMP_SCORE_TABLE
SELECT N'알고리즘' AS CLASS, 100 AS SCORE
UNION ALL
SELECT N'자료구조' AS CLASS, 99 AS SCORE
UNION ALL
SELECT N'JAVA' AS CLASS, 97 AS SCORE
UNION ALL
SELECT N'C#' AS CLASS, 96 AS SCORE
--SELECT INTO문으로 #TEMP1 임시테이블 생성
SELECT *
INTO #TEMP1
FROM
(
SELECT CLASS, SCORE FROM #TEMP_SCORE_TABLE
)A
--INSERT 실패
INSERT INTO #TEMP1
SELECT
'JavaScript'--10자리 문자열이므로 INSERT 실패
,94
--INSERT 성공
--서브 쿼리의 #TEMP_SCORE_TABLE 임시테이블의 CLASS가 NVARCHAR(06) 이므로
--#TEMP1에도 CLASS가 NVARCHAR(06)으로 복사되어 6자리까지 INSERT 가능
INSERT INTO #TEMP1
SELECT
'데이터베이스'--6자리 문자열이므로 INSERT 성공
,95
SELECT CLASS, SCORE FROM #TEMP1--데이터 확인
[예제 2]
SELECT *
INTO #TEMP1
FROM
(
SELECT N'알고리즘' AS CLASS, 100 AS SCORE
UNION ALL
SELECT N'자료구조' AS CLASS, 99 AS SCORE
UNION ALL
SELECT N'JAVA' AS CLASS, 97 AS SCORE
UNION ALL
SELECT N'C#' AS CLASS, 96 AS SCORE
)A
--INSERT 실패
--위의 SELECT문에서 #TEMP1생성시 가장 MAX인 문자열이 4자리(알고리즘, 자료구조) 였으므로
--4자리이상 문자열인 데이터베이스, JavaScript INSERT 실패
INSERT INTO #TEMP1
SELECT
'데이터베이스'--6자리 문자열이므로 INSERT 실패
,95
--INSERT 실패
INSERT INTO #TEMP1
SELECT
'JavaScript'--10자리 문자열이므로 INSERT 실패
,94
--INSERT 성공
INSERT INTO #TEMP1
SELECT
N'CSS'--3자리 문자열이므로 INSERT 성공
,93
SELECT CLASS, SCORE FROM #TEMP1--데이터 확인
[SELECT INTO문 행 삽입시 ORDER BY를 써도 정렬된 상태로 행 삽입이 안 되는 것을 확일할 수 있는 예제]
--INTO문 행 삽입시 ORDER BY 정렬 가능 여부 확인 예제
SELECT SEQ_NUM, [NAME]
INTO #TEMP_SEQ
FROM
(
SELECT 1 AS SEQ_NUM, '순서1' AS [NAME]
UNION ALL
SELECT 3, '순서3'
UNION ALL
SELECT 5, '순서5'
UNION ALL
SELECT 2, '순서2'
UNION ALL
SELECT 4, '순서4'
)A
ORDER BY A.SEQ_NUM
--실제 조회시 정렬되지 않은 행들이 조회됨.
SELECT * FROM #TEMP_SEQ
결론
오늘은 SELECT INTO문으로 임시 테이블을 생성하는 방법을 정리해보았습니다. 다른 분이 작성하신 쿼리를 보고 글을 작성할 영감을 얻고 지식도 습득하게 되었습니다. 오늘처럼 좀 더 다른 분들이 작성하신 쿼리를 분석하며 시야를 넓히는 습관을 들여야겠습니다!
Reference
[SELECT - INTO 절(Transact-SQL)]
docs.microsoft.com/ko-kr/sql/t-sql/queries/select-into-clause-transact-sql?view=sql-server-ver15