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