SQL-запрос - Использование Order By в UNION - PullRequest
83 голосов
/ 18 октября 2008

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

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

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

Примечание: это делается на ядре базы данных MS Access Jet

Ответы [ 16 ]

118 голосов
/ 03 августа 2010

Иногда вам нужно иметь 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
64 голосов
/ 18 октября 2008
SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1
57 голосов
/ 18 октября 2008

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

Ниже приведен запрос 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;

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

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

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

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

28 голосов
/ 16 сентября 2011

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

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
17 голосов
/ 18 октября 2008

Вот пример из 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 после последнего набора.

9 голосов
/ 18 октября 2008
(SELECT table1.field1 FROM table1 
UNION
SELECT table2.field1 FROM table2) ORDER BY field1 

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

5 голосов
/ 18 октября 2008
SELECT table1Column1 as col1,table1Column2 as col2
    FROM table1
UNION
(    SELECT table2Column1 as col1, table1Column2 as col2
         FROM table2
)
ORDER BY col1 ASC
4 голосов
/ 10 ноября 2011

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

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, и все три работают.

4 голосов
/ 12 июня 2011
SELECT field1
FROM ( SELECT field1 FROM table1
       UNION
       SELECT field1 FROM table2
     ) AS TBL
ORDER BY TBL.field1

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

2 голосов
/ 22 октября 2015

Просматривая этот раздел комментариев, я наткнулся на два разных шаблона, отвечающих на вопрос. К сожалению, для 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

...