Можно ли использовать предложение SELECT INTO с UNION [ALL]?


154

В 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.


Ты уверен, что тебе нужен союз всех?
sfossen

Да. Поскольку записи являются уникальными по всем таблицам.
Фердин

Ответы:


214

Это работает в 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
Также это работает SELECT top 100 * INTO tmpFerdeen ОТ UNION клиентов Все SELECT top 100 * FROM CustomerEurope UNION All SELECT top 100 * FROM CustomerAsia UNION Все SELECT top 100 * FROM CustomerAmericas (извините, здесь невозможно отформатировать sql). Спасибо!
Фердин

7
Какое значение имеет «как TMP»?
Дейв

@chrisVanOpstal, почему вы выбрали 100 лучших? Когда мы выбираем все записи, выдается сообщение об ошибке: «Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и выражениях общих таблиц, если только не указан TOP или FOR XML». Пожалуйста, дайте какое-нибудь решение.
ShaileshDev

1
Привет, что спросил @Dave, я вижу, что удаление «as tmp» приводит к ошибке «Неверный синтаксис, ожидающий as, id или quoted_id». Так для чего он используется?
Равид Гольденберг

4
@Dave, petric: в SQL Server временным таблицам нужно дать имя. Вот и все. Tmp не выполняет никаких других функций, кроме как делает оператор SQL допустимым. Например, в Oracle SQL это необязательно.
Ваутер

130

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

Просто поставь 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

2
Я не согласен - хотя приведенный выше ответ также является правильным, принятый ответ более
ясен

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

Этот "Блаблабал" нужен


1

Для запросов 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

1

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

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

Задача, которую я вижу с решением:

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

Удачи!


-1

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

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)

Отсутствует требуемый псевдоним таблицы (и, если он будет добавлен, будет совпадать с принятым ответом)
Мартин Смит,

-3

Попробуйте что-то вроде этого: создайте конечную таблицу объектов, 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
)

В SQL Server временные таблицы создаются на лету. Я хотел бы сделать это без создания окончательной таблицы объектов. Спасибо.
Фердин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.