일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Visual Studio 2015 삭제
- 리버스 프록시 예제
- tomcat
- Vue configureWebpack
- Visual Studio 2015 설치
- MSSQL 동적 쿼리
- 업무 자동화
- Nginx Reverse Proxy
- Visual Studio 강제 삭제
- Visual Studio 재설치
- 웹 크롤링
- Vue.config
- 프록시 예제
- Selenium 환경
- vue
- javascript
- vue3
- Tomcat Error
- MSSQL 문자열
- Selenium 설치
- .NET Core Proxy
- .NET Core
- Visual Studio 패키지에 실패했습니다.
- vue.js
- 웹 자동화
- 디자인 패턴 사례
- Visual Studio 2015 강제 삭제
- Vue3 configureWebpack
- SQLP
- spring
- Today
- Total
금백조의 개발 블로그
[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
'Database > SQL Server(MSSQL)' 카테고리의 다른 글
[MSSQL]SELECT, WHERE, ORDER BY절에서 CASE문 활용하기(SELECT CASE, WHERE CASE, ORDER BY CASE) (0) | 2021.03.28 |
---|---|
[MSSQL]ISNUMERIC을 이용한 숫자, 문자 판단 및 주의사항 (0) | 2021.03.14 |
[MSSQL]PIVOT을 이용하여 세로를 가로로 변환 방법(행 열 변환) (4) | 2021.02.28 |
[MSSQL]행 데이터를 문자열로 합치기 (0) | 2021.02.18 |
[MSSQL]CHAR, NCHAR 문자열 자료형 사용시 주의사항 (0) | 2021.02.06 |