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.


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

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

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


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

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

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!


-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)

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
)

Dalam tabel temp SQL Server dibuat dengan cepat. Saya ingin melakukan ini tanpa membuat tabel objek akhir. Terima kasih.
— Ferdeen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.