Можно ли использовать предложение SELECT INTO с UNION [ALL]? - PullRequest
130 голосов
/ 26 февраля 2009

В SQL Server это вставляет 100 записей из таблицы Customers в tmpFerdeen: -

SELECT top(100)*
INTO tmpFerdeen
FROM Customers

Можно ли сделать SELECT INTO через 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

Не совсем уверен, куда добавить предложение INTO.

Ответы [ 8 ]

186 голосов
/ 26 февраля 2009

Это работает в 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
118 голосов
/ 27 сентября 2012

Для этого вам вообще не нужна производная таблица.

Просто поставьте 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
5 голосов
/ 27 сентября 2012
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 голос
/ 23 мая 2018

Я бы сделал это так:

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 голос
/ 11 апреля 2017

Для запросов 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
0 голосов
/ 10 июня 2019

Проблема, которую я вижу с решением:

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

заключается в том, что при этом создается оконный набор данных, который будет находиться в ОЗУ, а для больших наборов данных это решение создаст серьезные проблемы с производительностью, поскольку сначала необходимо создать раздел, а затем использовать раздел для записи во временную таблицу.

Лучшим решением было бы следующее:

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

Удачи!

0 голосов
/ 26 февраля 2009

Может попробовать это?

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)
0 голосов
/ 26 февраля 2009

Попробуйте что-то вроде этого: создайте конечную таблицу объектов, 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
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...