Как сделать заказ с помощью союза - PullRequest
169 голосов
/ 17 января 2011

Можно ли заказать, когда данные поступают из многих, выбрать и объединить их вместе. Например,

Select id,name,age
From Student
Where age < 15
Union
Select id,name,age
From Student
Where Name like "%a%"

Как заказать этот запрос по имени.

Кто-то сказал, что вы можете сделать запрос похожим на это.

Select id,name,age
From Student
Where age < 15 or name like "%a%"
Order by name

Но в этом случае я просто игнорирую это решение.

Заранее спасибо.

Ответы [ 8 ]

238 голосов
/ 17 января 2011

Просто напишите

Select id,name,age
From Student
Where age < 15
Union
Select id,name,age
From Student
Where Name like "%a%"
Order by name

Порядок применяется для полного набора результатов

71 голосов
/ 17 января 2011
Select id,name,age
from
(
   Select id,name,age
   From Student
   Where age < 15
  Union
   Select id,name,age
   From Student
   Where Name like "%a%"
) results
order by name
22 голосов
/ 08 мая 2017

Чтобы применить сортировку только к первому оператору в UNION, вы можете поместить его в подвыбор с помощью UNION ALL (оба они необходимы в Oracle):

Select id,name,age FROM 
(    
 Select id,name,age
 From Student
 Where age < 15
 Order by name
)
UNION ALL
Select id,name,age
From Student
Where Name like "%a%"

Или (обращаясь к комментарию Николаса Кэри) вы можете гарантировать, что верхний SELECT упорядочен, а результаты отображаются над нижним SELECT следующим образом:

Select id,name,age, 1 as rowOrder
From Student
Where age < 15
UNION
Select id,name,age, 2 as rowOrder
From Student
Where Name like "%a%"
Order by rowOrder, name
12 голосов
/ 03 июня 2013

Оба других ответа верны, но я подумал, что стоит отметить, что место, где я застрял, не понимает, что вам понадобится порядок по псевдониму и убедитесь, что псевдоним одинаков для обоих селектов. так что

select 'foo'
union
select item as `foo`
from myTable
order by `foo`

обратите внимание, что в первом выборе я использую одинарные кавычки, а для остальных - обратные кавычки.

Это даст вам необходимую сортировку.

10 голосов
/ 09 марта 2015

Order By применяется после union, поэтому просто добавить предложение order by в конце операторов:

Select id,name,age
From Student
Where age < 15
Union
Select id,name,age
From Student
Where Name like '%a%'
Order By name
8 голосов
/ 01 июля 2016

Если я хочу, чтобы сортировка применялась только к одному из UNION, если используется Union all:

Select id,name,age
From Student
Where age < 15
Union all
Select id,name,age
From 
(
Select id,name,age
From Student
Where Name like "%a%"
Order by name
)
3 голосов
/ 11 октября 2018

Как указывалось в других ответах, 'Order by' после LAST Union должен применяться к обоим наборам данных, объединенным с помощью union.

У меня было два набора данных, но использовались разные таблицы, но одни и те же столбцы. «Order by» после того, как LAST Union все еще не работал. Использование ALIAS для столбца, используемого в порядке упорядочения, сделало свое дело.

Select Name, Address for Employee 
Union
Select Customer_Name, Address from Customer
order by customer_name;   --Won't work

Таким образом, решение - использовать псевдоним 'User_Name':

Select Name as User_Name, Address for Employee 
Union
Select Customer_Name as User_Name, Address from Customer
order by User_Name; 
0 голосов
/ 25 ноября 2018

Можно использовать это:

Select id,name,age
From Student
Where age < 15
Union ALL
SELECT * FROM (Select id,name,age
From Student
Where Name like "%a%")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...