SQL-запрос - Использование Order By в UNION
-
03-07-2019 - |
Вопрос
Как можно программно отсортировать запрос объединения при извлечении данных из двух таблиц?Например,
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
Генерирует исключение
Примечание:это делается в ядре базы данных MS Access Jet
Решение
Иногда вам нужно иметь 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
Другие советы
SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1
Я думаю, что это хорошо объясняет.
Ниже приведен запрос 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 по их положению в наборе результатов. Р>
В этом примере мы отсортировали результаты по имя_поставщика
/ имя_компании
в порядке возрастания, что обозначено как " ORDER BY 2 ".
Поля имя_поставщика
/ имя_компании
находятся на позиции № 2 в
набор результатов.
Взяты здесь: http://www.techonthenet.com/sql/union.php а> р>
Используя конкретный пример:
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
Желаемый результат: (результаты первого выбора first, т.е.сначала папки)
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
Вот пример из 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 после последнего набора.
(SELECT table1.field1 FROM table1
UNION
SELECT table2.field1 FROM table2) ORDER BY field1
Работать?Помните о множествах мыслей.Получите нужный набор, используя объединение, а затем выполните с ним свои операции.
SELECT table1Column1 as col1,table1Column2 as col2
FROM table1
UNION
( SELECT table2Column1 as col1, table1Column2 as col2
FROM table2
)
ORDER BY col1 ASC
SELECT field1
FROM ( SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
) AS TBL
ORDER BY TBL.field1
(используйте ALIAS)
Это самая глупая вещь, которую я когда-либо видел, но она работает, и с результатами не поспоришь.
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 и на всех трех работах.
Вот как это делается
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
Просматривая этот раздел комментариев, я наткнулся на два разных шаблона ответа на вопрос.К сожалению, для 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
Используя порядок отдельно, каждое подмножество получает порядок, но не весь набор, как вы хотели бы объединить две таблицы.
Вы должны использовать что-то вроде этого, чтобы иметь один упорядоченный набор:
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
Вторая таблица не может содержать имя таблицы в ORDER BY
оговорка.
Итак...
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY field1
Не создает исключения
При необходимости сохранить внутреннюю сортировку:
SELECT 1 as type, field1 FROM table1
UNION
SELECT 2 as type, field1 FROM table2
ORDER BY type, field1
(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
Попробуй это. Это сработало для меня. Р>
Для 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