UNION [ALL]과 함께 SELECT INTO 절을 사용할 수 있습니까?


154

SQL Server에서는 Customers 테이블에서 tmpFerdeen으로 100 개의 레코드를 삽입합니다.

SELECT top(100)*
INTO tmpFerdeen
FROM Customers

UNION ALL SELECT에서 SELECT INTO를 수행 할 수 있습니까?

SELECT top(100)* 
FROM Customers
UNION All
SELECT top(100)* 
FROM CustomerEurope
UNION All
SELECT top(100)* 
FROM CustomerAsia
UNION All
SELECT top(100)* 
FROM CustomerAmericas

INTO 절을 추가 할 위치가 확실하지 않습니다.


노조가 모두 필요하십니까?
sfossen

예. 레코드가 모든 테이블에서 고유하기 때문에.
Ferdeen

답변:


214

이것은 SQL Server에서 작동합니다.

SELECT * INTO tmpFerdeen FROM (
  SELECT top 100 * 
  FROM Customers
  UNION All
  SELECT top 100 * 
  FROM CustomerEurope
  UNION All
  SELECT top 100 * 
  FROM CustomerAsia
  UNION All
  SELECT top 100 * 
  FROM CustomerAmericas
) as tmp

1
또한이 기능은 SELECT top 100 * INTO tmpFerdeen FROM Customers UNION All SELECT top 100 * FROM CustomerEurope UNION All SELECT top 100 * FROM CustomerAsia UNION All SELECT top 100 * FROM CustomerAmericas (죄송합니다 여기에서 SQL 형식을 지정할 수 없음). 감사!
Ferdeen

7
"as tmp"의 의미는 무엇입니까?
Dave

@ chrisVanOpstal, 왜 상위 100 대를 선택하셨습니까? 모든 레코드를 선택하면 "TOP 또는 FOR XML도 지정하지 않으면 ORDER BY 절이 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 표현식에서 유효하지 않습니다."라는 오류가 발생합니다. 해결책을 알려주세요.
ShaileshDev

1
@Dave가 요청한 것에 대해 안녕하세요. "tmp로"를 제거하면 "잘못된 구문, as, id 또는 quoted_id를 기대합니다"라는 오류가 발생합니다. 그래서 무엇을 위해 사용됩니까?
Ravid Goldenberg

4
@Dave, petric : SQL Server에서 임시 테이블 이름을 지정해야합니다. 그게 다야. tmp는 SQL 문을 유효한 것으로 만드는 것 이외의 다른 기능을 제공하지 않습니다. 예를 들어 Oracle SQL의 경우 이것은 선택 사항입니다.
Wouter

130

이를 위해 파생 테이블이 전혀 필요하지 않습니다.

그냥 INTO후를 넣어SELECT

SELECT top(100)* 
INTO tmpFerdeen
FROM Customers
UNION All
SELECT top(100)* 
FROM CustomerEurope
UNION All
SELECT top(100)* 
FROM CustomerAsia
UNION All
SELECT top(100)* 
FROM CustomerAmericas

2
나는 동의 - 위의 답도 정확 동안, 허용 대답이의 의도에 명확
endurium

5
SELECT * INTO tmpFerdeen FROM 
(SELECT top(100)*  
FROM Customers 
UNION All 
SELECT top(100)*  
FROM CustomerEurope 
UNION All 
SELECT top(100)*  
FROM CustomerAsia 
UNION All 
SELECT top(100)*  
FROM CustomerAmericas) AS Blablabal

이 "Blablabal"이 필요합니다


1

MS Access 쿼리의 경우 다음과 같이 작동했습니다.

SELECT * INTO tmpFerdeen FROM( 
    SELECT top(100) *
    FROM Customers 
UNION All 
    SELECT top(100) *  
    FROM CustomerEurope 
UNION All 
    SELECT top(100) *  
    FROM CustomerAsia 
UNION All 
    SELECT top(100) *  
    FROM CustomerAmericas
) 

이것은 MS Access에서 작동하지 않았습니다

SELECT top(100) * 
  INTO tmpFerdeen
  FROM Customers
UNION All
  SELECT top(100) * 
  FROM CustomerEurope
UNION All
  SELECT top(100) * 
  FROM CustomerAsia
UNION All
  SELECT top(100) * 
  FROM CustomerAmericas

1

나는 이렇게 할 것입니다 :

SELECT top(100)* into #tmpFerdeen
FROM Customers

Insert into #tmpFerdeen
SELECT top(100)* 
FROM CustomerEurope

Insert into #tmpFerdeen
SELECT top(100)* 
FROM CustomerAsia

Insert into #tmpFerdeen
SELECT top(100)* 
FROM CustomerAmericas

0

솔루션으로 볼 수있는 과제 :

FROM( 
SELECT top(100) *
    FROM Customers 
UNION
    SELECT top(100) *  
    FROM CustomerEurope 
UNION 
    SELECT top(100) *  
    FROM CustomerAsia 
UNION
    SELECT top(100) *  
    FROM CustomerAmericas
)

이것은 RAM에 상주하는 창 데이터 세트를 작성하고 더 큰 데이터 세트에서이 솔루션은 먼저 파티션을 작성해야하고 파티션을 사용하여 임시 테이블에 기록하므로 심각한 성능 문제를 발생시킵니다.

더 나은 해결책은 다음과 같습니다.

SELECT top(100)* into #tmpFerdeen
FROM Customers

Insert into #tmpFerdeen
SELECT top(100)* 
FROM CustomerEurope

Insert into #tmpFerdeen
SELECT top(100)* 
FROM CustomerAsia

Insert into #tmpFerdeen
SELECT top(100)* 
FROM CustomerAmericas

임시 테이블에 삽입을 선택한 다음 행을 추가하십시오. 그러나 여기에 단점은 데이터에 중복 행이있는 경우입니다.

최선의 해결책은 다음과 같습니다.

Insert into #tmpFerdeen
SELECT top(100)* 
FROM Customers
UNION
SELECT top(100)* 
FROM CustomerEurope
UNION
SELECT top(100)* 
FROM CustomerAsia
UNION
SELECT top(100)* 
FROM CustomerAmericas

이 방법은 고유 한 행이 필요한 모든 목적에 적합합니다. 그러나 중복 행을 원할 경우 UNION ALL을 위해 UNION을 간단히 교체하십시오.

행운을 빕니다!


-1

어쩌면 이것을 시도?

SELECT * INTO tmpFerdeen (
SELECT top(100)* 
FROM Customers
UNION All
SELECT top(100)* 
FROM CustomerEurope
UNION All
SELECT top(100)* 
FROM CustomerAsia
UNION All
SELECT top(100)* 
FROM CustomerAmericas)

필수 테이블 별칭이 누락되었습니다 (추가 된 경우 허용되는 답변과 동일 함)
Martin Smith

-3

다음과 같이 해보십시오. 공용체 구조로 최종 오브젝트 테이블 tmpFerdeen을 작성하십시오.

그때

INSERT INTO tmpFerdeen (
SELECT top(100)* 
FROM Customers
UNION All
SELECT top(100)* 
FROM CustomerEurope
UNION All
SELECT top(100)* 
FROM CustomerAsia
UNION All
SELECT top(100)* 
FROM CustomerAmericas
)

SQL Server에서는 임시 테이블이 즉시 생성됩니다. 최종 객체 테이블을 만들지 않고이 작업을 수행하고 싶습니다. 감사.
Ferdeen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.