UNECT [ALL] ile SELECT INTO yan tümcesini kullanmak mümkün müdür?


154

SQL Server'da bu, Müşteriler tablosundan tmpFerdeen'e 100 kayıt ekler: -

SELECT top(100)*
INTO tmpFerdeen
FROM Customers

BÜTÜN BİR SEÇİM BİRLİĞİNE SEÇİM YAPMAK MÜMKÜN MÜ?

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 deyiminin nereye ekleneceğinden emin değilim.


Sendikaların hepsine ihtiyacınız olduğundan emin misiniz?
sfossen

Evet. Kayıtlar tüm tablolar arasında benzersiz olduğundan.
Ferdeen

Yanıtlar:


214

SQL Server'da çalışır:

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
Aynı zamanda bu SELECT top 100 * INT'e kadar Teşekkürler!
Ferdeen

7
"As tmp" nin önemi nedir?
Dave

@chrisVanOpstal, neden ilk 100'ü seçtiniz? Tüm kayıtları seçtiğimizde, "ORDER BY deyimi, TOP veya FOR XML de belirtilmezse, görünümlerde, satır içi işlevlerde, türetilmiş tablolarda, alt sorgularda ve ortak tablo ifadelerinde geçersizdir" şeklinde hata verir. Lütfen biraz çözüm verin.
ShaileshDev

1
Merhaba @Dave sordu hakkında, ben "as tmp" kaldırılması "Hata, sözdizimi as, id veya quoted_id bekliyor" ile sonuçlanır görüyorum. Peki ne için kullanılıyor?
Ravid Goldenberg

4
@Dave, petric: SQL Server'da geçici tablolara bir ad verilmelidir. Bu kadar. Tmp, SQL deyimini geçerli yapmaktan başka bir işleve hizmet etmez. Örneğin, Oracle SQL'de bu isteğe bağlıdır.
Wouter

130

Bunun için türetilmiş bir tabloya ihtiyacınız yoktur.

Sadece ilkinden INTOsonra koySELECT

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
Kabul
etmiyorum

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

Bu "Blablabal" gereklidir


1

MS Access sorguları için bu işe yaradı:

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'te bu çalışmadı

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

Bunu şöyle yaparım:

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

Çözüm ile gördüğüm zorluk:

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

Bunun RAM'de bulunacak pencereli bir veri kümesi oluşturması ve daha büyük veri kümelerinde bu çözümün önce bölümü oluşturması ve daha sonra geçici tabloya yazmak için bölümü kullanması nedeniyle ciddi performans sorunları yaratacağıdır.

Daha iyi bir çözüm şu olabilir:

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

geçici tabloya ekle'yi seçin ve ardından ek satırlar ekleyin. Ancak buradaki geri çekme, verilerde yinelenen satırlar olup olmadığıdır.

En İyi Çözüm aşağıdaki olabilir:

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

Bu yöntem, farklı satırlar gerektiren tüm amaçlar için çalışmalıdır. Ancak, yinelenen satırların BİRLİĞİ İÇİN BİRLİĞİ

İyi şanslar!


-1

Belki bunu denemek?

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)

Gerekli tablo takma adı eksik (ve eklenirse kabul edilen cevapla aynı olacaktır)
Martin Smith

-3

Bunun gibi bir şey deneyin: Son nesne tablosunu, tmpFerdeen'i birliğin yapısıyla oluşturun.

Sonra

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'da geçici tablolar anında oluşturulur. Bunu bir son nesne tablosu oluşturmadan yapmak istiyorum. Teşekkürler.
Ferdeen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.