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

はい。レコードはすべてのテーブルで一意であるため。
フェルディーン09

回答:


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をフォーマットすることはできません)。ありがとう!
フェルディーン09

7
「tmpとして」の意味は何ですか?
Dave、

@chrisVanOpstal、なぜトップ100を選択したのですか?すべてのレコードを選択すると、「TOPまたはFOR XMLも指定されていない限り、ORDER BY句はビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では無効です。」というエラーが発生します。解決策を教えてください。
ShaileshDev 2017年

1
@Daveの質問についてこんにちは。 "as tmp"を削除すると、 "as、id、またはquoted_idを予期している不正な構文"というエラーが発生することがわかります。それでそれは何のために使われるのですか?
Ravid Goldenberg 2017

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
私は同意しません-上記の答えも正しいですが、受け入れられた答えはその意図の中でより明確です
エンデュリウム

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

この「口唇」が必要です


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をUNION ALLに交換するだけです。

がんばって!


-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では、一時テーブルがその場で作成されます。最終的なオブジェクトテーブルを作成せずにこれを実行したいと思います。ありがとう。
フェルディーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.