web-dev-qa-db-fra.com

Est-il possible d'utiliser la clause SELECT INTO avec UNION [ALL]?

Dans SQL Server, cela insère 100 enregistrements de la table Customers dans tmpFerdeen: -

SELECT top(100)*
INTO tmpFerdeen
FROM Customers

Est-il possible de faire un SELECT INTO sur un 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

Vous ne savez pas trop où ajouter la clause INTO.

136
Ferdeen

Cela fonctionne dans 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
197
Chris Van Opstal

Vous n'avez pas du tout besoin d'une table dérivée pour cela.

Il suffit de mettre le INTO après le premier 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
123
Martin Smith
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

Ce "Blablabal" est nécessaire

5
user1006743

Je le ferais comme ça:

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
1
Praveen R

Pour les requêtes MS Access, cela a fonctionné:

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
) 

Cela n'a pas fonctionné dans 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
Bobby

Le défi que je vois avec la solution:

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

c’est que cela crée un jeu de données fenêtré qui résidera dans la RAM et que, sur des jeux de données plus volumineux, cette solution créera de graves problèmes de performances, car elle doit d’abord créer la partition, puis utiliser cette partition pour écrire sur le disque. table de temp.

Une meilleure solution serait la suivante:

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

pour sélectionner insérer dans la table temporaire, puis ajoutez des lignes supplémentaires. Cependant, l’inconvénient est qu’il existe des lignes en double dans les données.

La meilleure solution serait la suivante:

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

Cette méthode devrait fonctionner pour toutes les applications nécessitant des lignes distinctes. Si, toutefois, vous souhaitez que les lignes en double remplacent simplement UNION pour UNION ALL

Bonne chance!

0
Chris Peterson