Как можно программно отсортировать запрос на объединение при извлечении данных из двух таблиц? Например,
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
Выдает исключение
Примечание: это делается на ядре базы данных MS Access Jet.
SELECT TOP 100 PERCENT
на, чтобы использовать ихORDER BY
в подзапросеSELECT field1 FROM table1 UNION SELECT field1 FROM table2 ORDER BY field1
источник
UNION
не позволяет этому случиться. Для этого может быть другая конструкция. Может и не быть. В любом случае этот ответ технически не соответствует тому, о чем спрашивал автор.ORDER BY
это часть курсора, ноUNION
работает с таблицами, поэтому их код не может работать. Я не понимаю, как вы можете сделать вывод о намерении ОП из абсурдного кода. Учтите, что SQLUNION
удаляет дубликаты: если это ваши «упорядоченные наборы результатов»,{1, 2, 3} UNION {2, 4, 6}
будет ли результат{1, 2, 3, 4, 6}
или{1, 3, 2, 4, 6}
? Мы не знаем, потому что объединение «упорядоченных наборов результатов» не определено в отношении SQL, а OP не указан.Я думаю, что это хорошее объяснение.
Ниже приведен запрос 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
источник
На конкретном примере:
SELECT name FROM Folders ORDER BY name UNION SELECT name FROM Files ORDER BY name
Файлы:
Папки:
Желаемый результат : (сначала результаты первого выбора, т.е. сначала папки)
SQL для достижения желаемых результатов:
SELECT name FROM ( SELECT 1 AS rank, name FROM Folders UNION SELECT 2 AS rank, name FROM Files) dt ORDER BY rank, name
источник
dt
), иначе это не сработает. Некоторое время я был озадачен этим, поскольку я сначала опустил эту деталь, а сообщение об ошибке, выдаваемое SSMS, не особенно полезно.Вот пример из 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
источник
(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
источник