with temp7 as
(
select ....
from ....
where ...
)
select *
from temp7
where ...
이 쿼리를 실행한 후 나온 결과를 새로운 테이블로 만들고 싶은데 어떤 방법이 있는지요..
------------------------------------------------
찾아보니 SELECT * INTO 문을 사용하면 될 것 같아
select * into temp8 from (select * from temp7)
이렇게 작성해봤는데 에러가 발생하는 상황입니다.
SELECT [삽입할 컬럼1], [삽입할 컬럼2] ... INTO [#임시 테이블명] FROM [데이터를 가져올 테이블명] with temp7 as ( select .... from .... where ... ) select * into #TEMP_TABLE from temp7 where .. SELECT *FROM #TEMP_TABLE DROP TABLE #TEMP_TABLE - 반드시 원테이블이 아닌 임시테이블 DROP
에러메시지 확인하세요.
에러메시지 속에 답이 있습니다.
select * into temp8 from (select * from temp7)
<-- 이게 다 인건가요? 뭔가 부족해 보이는데
몇가지 에러 가능성이 보입니다.
1. temp7 이 있는가? WITH 문 없이 가능한 것인지?
2. 인라인뷰에 알리아스 필수입니다. 괄호 뒤 알리아스 지정 필수
1. with 문은
- 해당 기능이 필요할 때 사용하는 것일 뿐 (인라인뷰와 유사한 기능)
- 반드시 사용해야 할 의무사항 같은 것이 있는게 아닙니다. (인라인뷰로 대체 가능)
2. temp7 은
- with 문에서 정의한 집합의 명칭인데
- with 문 없이 그냥 temp7 을 사용하면 당연히 안되겠지요.
- with temp7 AS (...) select * from temp7; <-- 정상
- select * from temp7; <-- 오류
with 문을 사용한 이유는
첫 번째 select문을 작성할 때 기존변수에는 없는 파생변수를 생성하였고
그 파생변수를 사용해서 특정조건을 조회를 할 필요가 있었기에
with 구문을 사용했습니다.
* 제가 잘못알고 있는것인지는 모르겠으나, MS SQL의 경우 파생변수로 특정조건을 조회할 필요가 있는경우
with 구문을 사용해야하는걸로 알고 있습니다.
* temp7이 있는가? 라는 의미를 잘 모르겠습니다. 저는 결론적으로 제가 위에 작성한 with 구문을 실행시켜
원하는 결과를 추출한 상태입니다.
말씀해주대로 아래와 같이 알리아스를 지정 후
select * into ~ from temp7) A
with 부터 A까지 전체를 블록을 잡고 결과를 실행해봤는데 에러메세지가 발생하고 있는 상황입니다.
에러메세지 : 개체 이름 'temp7'이(가) 유효하지 않습니다.
말씀해주신대로 temp7이 문제인것 같은데, 어떤 식으로 구문을 수정하면 될지 감이 오지를 않습니다...
답변해주셔서 항상 감사드립니다.
with문을 블록을 잡지 않은 않은 상태에서,
select * into ~~ 구문만을 실행한 것은 아닙니다.
with문부터 마지막 알리아스 A까지 전부 블록을 잡고 실행을 했는데도 불구하고
에러메세지 : 개체 이름 'temp7'이(가) 유효하지 않습니다.
라는 메세지가 뜨는 상황입니다...
MS-SQL에서는 다른 방법으로 접근을 해야하나봅니다.
SQL 구문의 단위를 이해하셔야 합니다.
블럭으로 잡는다고 두개의 구문이 하나로 묶이는게 아닙니다.
두개의 구문이 각각 수행되는 것이죠.
두번째 구문에서는 첫번째 구문의 temp7 을 사용할 수 없습니다.
두번째 구문에 별도의 with 문이 필요합니다.
이 질문의 맨 첫번째 답글에도
with 문이 포함된 구문으로 된 답변이 이미 있습니다.
맨 첫글 답변 참고해 보세요.
이 질문의 맨 마지막 답글에는
WITH 문 대신 인라인뷰를 이용한는 방법도 제시되어 있습니다.
맨 마지막 답변 참고해 보세요.
insert into 임시테이블 with temp7 as ( select .... from .... where ... ) select * from temp7 where ...
아마 이런 형식을 원하신건 아닐지....
with temp7 as ( select .... from .... where ... ) insert into 임시테이블 select * from temp7 where ...
db에 따라 이렇게 해야 할 수도....
아... 이 방법은 임시 테이블을 미리 생성을 해놔야 오류가 없는 형태라는걸 빼먹었네요.
select * into 임시테이블 from ( select .... from .... where ... ) t1 where ...
with 문이 문제라면 이런 쿼리는 어떤가요?
두가지 모두 안되네요...ㅎㅎ
그래도 답변주셔서 감사드립니다.