SQL-запрос - с помощью заказа в Союз
как можно программно отсортировать запрос объединения при извлечении данных из двух таблиц? Например,
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
исключение
Примечание: это делается на MS Access Jet database engine
16 ответов:
иногда вам нужно иметь
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
Я думаю, что это делает хорошую работу, объясняя.
ниже приведен запрос объединения, который использует предложение 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
в порядке возрастания, как обозначается "порядок 2".в
supplier_name
/company_name
поля в позиции № 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
Желаемый Результат: (результаты первого выбора сначала, т. е. папки сначала)
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
(использовать псевдоним)
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