SQL Query - использование порядка в UNION

Как можно программно сортировать запрос объединения при извлечении данных из двух таблиц? Например,

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1

Выдает исключение

Примечание. Это делается при использовании механизма базы данных MS Access Jet.

Ответ 1

Иногда вам нужно иметь ORDER BY в каждом из разделов, которые необходимо объединить с UNION.

В этом случае

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

Ответ 2

SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1

Ответ 3

Я думаю, что это хорошо объясняет.

Ниже приведен запрос UNION, в котором используется предложение ORDER BY:

select supplier_id, supplier_name
from suppliers
where supplier_id > 2000
UNION
select company_id, company_name
from companies
where company_id > 1000
ORDER BY 2;

Поскольку имена столбцов различаются между двумя операциями "select", более выгодно ссылаться на столбцы в предложении ORDER BY по их позиции в наборе результатов.

В этом примере мы отсортировали результаты с помощью supplier_name/company_name в порядке возрастания, как обозначено "ORDER BY 2".

Поля supplier_name/company_name находятся в позиции №2 в результат.

Взято отсюда: http://www.techonthenet.com/sql/union.php

Ответ 4

Используя конкретный пример:

SELECT name FROM Folders ORDER BY name
UNION
SELECT name FROM Files ORDER BY name

Файлы:

name
=============================
RTS.exe
thiny1.etl
thing2.elt
f.txt
tcpdump_trial_license (1).zip

Папки:

name
============================
Contacts
Desktop
Downloads
Links
Favorites
My Documents

Желаемый результат: (сначала выбираются первые сначала, т.е. папки)

Contacts
Desktop
Downloads
Favorites
Links
My Documents
f.txt
RTMS.exe
tcpdump_trial_license (1).zip
thiny1.etl
thing2.elt

SQL для достижения желаемых результатов:

SELECT name 
FROM (
    SELECT 1 AS rank, name FROM Folders
    UNION 
    SELECT 2 AS rank, name FROM Files) dt
ORDER BY rank, name

Ответ 5

Вот пример из Northwind 2007:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;

Предложение ORDER BY просто должно быть последним утверждением после того, как вы сделали все свое объединение. Вы можете объединить несколько наборов вместе, а затем поставить предложение ORDER BY после последнего набора.

Ответ 6

(SELECT table1.field1 FROM table1 
UNION
SELECT table2.field1 FROM table2) ORDER BY field1 

Работа? Помните мыслительные множества. Получите набор, который вы хотите, используя объединение, а затем выполните свои операции над ним.

Ответ 7

SELECT table1Column1 as col1,table1Column2 as col2
    FROM table1
UNION
(    SELECT table2Column1 as col1, table1Column2 as col2
         FROM table2
)
ORDER BY col1 ASC

Ответ 8

SELECT field1
FROM ( SELECT field1 FROM table1
       UNION
       SELECT field1 FROM table2
     ) AS TBL
ORDER BY TBL.field1

(используйте ALIAS)

Ответ 9

Это самая глупая вещь, которую я когда-либо видел, но она работает, и вы не можете спорить с результатами.

SELECT *
FROM (
    SELECT table1.field1 FROM table1 ORDER BY table1.field1
    UNION
    SELECT table2.field1 FROM table2 ORDER BY table2.field1
) derivedTable

Внутренняя часть производной таблицы не будет выполняться сама по себе, но как производная таблица работает отлично. Я пробовал это на SS 2000, SS 2005, SS 2008 R2, и все три работы.

Ответ 10

Вот как это делается

select * from 
    (select top 100 percent pointx, pointy from point
     where pointtype = 1
     order by pointy) A
union all
select * from 
    (select top 100 percent pointx, pointy from point
     where pointtype = 2
     order by pointy desc) B

Ответ 11

Просматривая этот раздел комментариев, я встретил два разных шаблона, отвечая на вопрос. К сожалению, для SQL 2012 второй шаблон не работает, поэтому здесь моя "работа вокруг"


Заказ по общей колонке

Это самый простой случай, с которым вы можете столкнуться. Как и многие пользователи, все, что вам действительно нужно сделать, это добавить Order By в конце запроса

SELECT a FROM table1
UNION
SELECT a FROM table2
ORDER BY field1

или

SELECT a FROM table1 ORDER BY field1
UNION
SELECT a FROM table2 ORDER BY field1

Порядок в разных столбцах

Здесь, где это действительно сложно. Используя SQL 2012, я пробовал верхнюю запись, и она не работает.

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

Следуя рекомендациям в комментарии, я пробовал это

SELECT * FROM 
(
  SELECT TOP 100 PERCENT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT TOP 100 PERCENT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

Этот код выполнил компиляцию, но DUMMY_ALIAS1 и DUMMY_ALIAS2 переопределили Order By, установленные в операторе Select, что делает это непригодным для использования.

Единственное решение, о котором я мог думать, которое работало для меня, - это не использование объединения, а вместо этого выполнение запросов выполняться индивидуально, а затем работать с ними. Таким образом, в основном, не используя Union, когда вы хотите Order By

Ответ 12

Используя порядок отдельно, каждое подмножество получает порядок, но не весь набор, что вы хотели бы объединить две таблицы.

Вы должны использовать что-то вроде этого, чтобы иметь упорядоченный набор один:

SELECT TOP (100) PERCENT field1, field2, field3, field4, field5 FROM 
(SELECT table1.field1, table1.field2, table1.field3, table1.field4, table1.field5 FROM table1
UNION ALL 
SELECT table2.field1, table2.field2, table2.field3, table2.field4, table2.field5 FROM  table2) 
AS unitedTables ORDER BY field5 DESC

Ответ 13

Вторая таблица не может содержать имя таблицы в предложении ORDER BY.

Итак...

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY field1

Не генерирует исключение

Ответ 14

Если необходимо сохранить внутреннюю сортировку:

SELECT 1 as type, field1 FROM table1 
UNION 
SELECT 2 as type, field1 FROM table2 
ORDER BY type, field1

Ответ 15

(SELECT FIELD1 AS NEWFIELD FROM TABLE1 ORDER BY FIELD1)
UNION
(SELECT FIELD2 FROM TABLE2 ORDER BY FIELD2)
UNION
(SELECT FIELD3 FROM TABLE3 ORDER BY FIELD3) ORDER BY NEWFIELD

Попробуйте это. Это сработало для меня.

Ответ 16

Для Sql Server 2014/2012/Другие (не проверено):

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) 
as DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) 
as DUMMY_ALIAS2