Как использовать UNION при вставке в таблицу с помощью предложения SELECT из многих таблиц в SQL Server 2000 - PullRequest
1 голос
/ 19 января 2011

Я использую SQL Server 2000. У меня есть несколько критериев, которые я должен использовать для извлечения различных наборов записей из таблицы mumtiple в другой таблице. Я использую

INSERT INTO T1(A,B)
(SELECT E,R FROM T2)
UNION
(SELECT Z,X FROM T3)

Анализатор запросов выдает ошибку, что при использовании UNION вы должны использовать предложение ORDER BY с SELECT. Даже после этого я не могу объединить два разных запроса, которые получают одинаковые столбцы в предложении select.

Как правильно вставить, используя SELECTS с UNIONS и ORDER BY.

1 Ответ

3 голосов
/ 19 января 2011

Псевдо слишком загадочно (уменьшено?) Очень маловероятно, чтобы в каждом перекрестном объединении 2 таблиц было 2 столбца в каждом из компонентов объединения

INSERT INTO T1(A,B)
(SELECT * FROM E,R)
UNION
(SELECT * FROM Z,X)

Примечание: Если у вас есть ЛЮБОЙ порядок по выражениюв общем случае должно находиться в конце объединения

INSERT T1(A,B)
SELECT P,Q FROM E,R
UNION
SELECT R,S FROM Z,X

@ обновлено на основе текста ошибки "Сервер: Msg 104, Уровень 15, Состояние 1, Строка 1Элементы ORDER BY должны отображаться в списке выбора, если в операторе содержится оператор UNION "

Это происходит, когда у вас есть объединение, которое пытается выполнить ORDER BY для столбца, который не отображается в результате.Рассмотрим обычный ORDER BY, включающий невыбранные столбцы

select top 10 name from syscolumns order by xtype

Строки согласованы, и запрос может быть выполнен.Однако, если вы сделали

select top 10 name from syscolumns where xtype > 50
union all
select top 10 name from syscolumns where xtype < 50
order by xtype

ДАЖЕ ЕСЛИ xtype существует в обеих частях UNION, но время, когда он представлен ORDER BY (который работает в конце на всем наборе результатов), столбецне там.Вам придется переписать его (если вы не хотите показывать xtype) как

select name from (
    select top 10 name, xtype from syscolumns where xtype > 50
    union all
    select top 10 name, xtype from syscolumns where xtype < 50
) x
order by xtype

Надеюсь, что поможет

...