Apakah mungkin menggunakan klausa SELECT INTO dengan UNION [ALL]?

154

Dalam SQL Server ini menyisipkan 100 catatan, dari tabel pelanggan ke tmpFerdeen: -

SELECT top(100)*
INTO tmpFerdeen
FROM Customers

Apakah mungkin untuk melakukan SELECT INTO melintasi UNION ALL SELECT: -

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

Tidak terlalu yakin di mana menambahkan klausa INTO.

Ferdeen
sumber
Apakah Anda yakin Anda membutuhkan serikat pekerja semuanya?
sfossen
Iya. Sebagai catatan adalah unik di semua tabel.
Ferdeen

Jawaban:

214

Ini berfungsi di 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
Chris Van Opstal
sumber
1
Ini juga berfungsi SELECT top 100 * INTO tmpFerdeen DARI UNION Pelanggan Semua SELECT top 100 * DARI PelangganEurope UNION Semua SELECT top 100 * DARI CustomerAsia UNION Semua SELECT top 100 * DARI CustomerAmericas (maaf tidak dapat memformat sql di sini). Terima kasih!
Ferdeen
7
Apa pentingnya "sebagai tmp"?
Dave
@chrisVanOpstal, mengapa Anda memilih 100 teratas? Ketika kami memilih semua catatan itu memberikan kesalahan sebagai- "Klausa ORDER BY tidak valid dalam tampilan, fungsi inline, tabel turunan, subkueri, dan ekspresi tabel umum, kecuali TOP atau UNTUK XML juga ditentukan.". Tolong beri beberapa solusi.
ShaileshDev
1
Hai tentang apa yang diminta @Dave, saya melihat bahwa menghapus "sebagai tmp" menghasilkan kesalahan "Sintaks yang salah mengharapkan sebagai, id, atau dikutip_id". Jadi untuk apa ini digunakan?
Ravid Goldenberg
4
@Dave, petric: di SQL Server, tabel sementara perlu diberi nama. Itu saja. Tmp tidak melayani fungsi lain selain membuat pernyataan SQL yang valid. Pada Oracle SQL, misalnya, ini opsional.
Wouter
130

Anda tidak perlu tabel turunan sama sekali untuk ini.

Masukkan saja INTOsetelah yang pertamaSELECT

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
Martin Smith
sumber
2
Saya tidak setuju - sementara jawaban di atas juga benar, jawaban yang diterima lebih jelas dalam niatnya
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" ini diperlukan

pengguna1006743
sumber
1

Untuk kueri MS Access, ini berfungsi:

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
) 

Ini TIDAK berfungsi di 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
Polisi
sumber
1

Saya akan melakukannya seperti ini:

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
Praveen R
sumber
0

Tantangan yang saya lihat dengan solusinya:

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

adalah bahwa ini membuat set data berjendela yang akan berada di RAM dan pada set data yang lebih besar solusi ini akan menciptakan masalah kinerja yang parah karena pertama-tama harus membuat partisi dan kemudian akan menggunakan partisi untuk menulis ke tabel temp.

Solusi yang lebih baik adalah sebagai berikut:

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

untuk memilih masukkan ke tabel temp dan kemudian tambahkan baris tambahan. Namun penarikan kembali ke sini adalah jika ada baris duplikat dalam data.

Solusi Terbaik adalah sebagai berikut:

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

Metode ini harus bekerja untuk semua tujuan yang memerlukan baris berbeda. Namun, jika Anda ingin baris duplikat cukup menukar UNION untuk UNION ALL

Semoga berhasil!

Chris Peterson
sumber
-1

Mungkin coba ini?

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)
Ryan
sumber
Kehilangan alias tabel yang diperlukan (dan jika ditambahkan akan sama dengan jawaban yang diterima)
Martin Smith
-3

Coba sesuatu seperti ini: Buat tabel objek akhir, tmpFerdeen dengan struktur serikat.

Kemudian

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
)
achinda99
sumber
Dalam tabel temp SQL Server dibuat dengan cepat. Saya ingin melakukan ini tanpa membuat tabel objek akhir. Terima kasih.
Ferdeen