금백조의 개발 블로그

[MSSQL]SELECT INTO문을 통한 임시테이블 생성(SELECT INTO절) 본문

Database/SQL Server(MSSQL)

[MSSQL]SELECT INTO문을 통한 임시테이블 생성(SELECT INTO절)

금백조 2021. 3. 4. 22:31
반응형

서론

 

평소에 임시 테이블을 생성할 시 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

반응형