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.