如何通过工会订购

时间:2011-01-17 17:09:02

标签: sql

当数据来自多个选择并将它们合并在一起时,是否可以订购。例如

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

但在这种情况下,我只是忽略了解决方案。

提前谢谢。

10 个答案:

答案 0 :(得分:232)

只需写下

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

order by应用于完整的结果集

答案 1 :(得分:70)

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

答案 2 :(得分:22)

为了使排序仅适用于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%"

或者(解决Nicholas Carey的评论)你可以保证顶级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

答案 3 :(得分:12)

其他答案都是正确的,但我认为值得注意的是,我遇到的地方没有意识到你需要通过别名订购,并确保两个选择的别名相同。那么

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

请注意,我在第一个选择中使用单引号,但在其他选项中使用反引号。

这将为您提供所需的分类。

答案 4 :(得分:10)

Order Byunion之后应用,所以只是 在语句末尾添加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

答案 5 :(得分:8)

如果我想将排序仅应用于其中一个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
)

答案 6 :(得分:2)

如其他答案所述,LAST Union之后的“排序依据”应适用于两个通过Union联接的数据集。

我有两个数据集,但使用不同的表,但使用相同的列。 LAST Union之后的“订购依据”仍然无效。 将ALIAS用于​​“ order by”中使用的列就可以了。

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; 

答案 7 :(得分:0)

可以使用:

Select id,name,age
From Student
Where age < 15
Union ALL
SELECT * FROM (Select id,name,age
From Student
Where Name like "%a%")

答案 8 :(得分:0)

要将ORDER BY或LIMIT子句应用于单个SELECT,请在SELECT上加上括号,并将该子句放在括号内:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

答案 9 :(得分:0)

在查询中添加一列,该列可以标识要排序的数据。

在下面的示例中,我将通用表表达式与您显示的选择一起使用,将它们放置在CTE中的特定组中,然后对这两个组进行union进入AllStudents

然后,最终选择将首先对AllStudents列中的SortIndex 进行排序,然后对name的进行排序,例如: / p>

WITH Juveniles as
(
      Select 1 as [SortIndex], id,name,age From Student
      Where age < 15
),

AStudents as
(
      Select 2 as [SortIndex], id,name,age From Student
      Where Name like "%a%" 
),

AllStudents as
(
      select * from Juveniles
      union 
      select * from AStudents
)

select * from AllStudents
sort by [SortIndex], name;

总而言之,它将首先获取所有按组进行排序的学生,然后按组内的名称对子进行排序。