如何通过工会订购

Gui*_*mos 184 sql

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

Select id,name,age
From Student
Where age < 15
Union
Select id,name,age
From Student
Where Name like "%a%"
Run Code Online (Sandbox Code Playgroud)

如何按名称订购此查询.

有人说你可以查询这样的.

Select id,name,age
From Student
Where age < 15 or name like "%a%"
Order by name
Run Code Online (Sandbox Code Playgroud)

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

先感谢您.

ber*_*d_k 250

写吧

Select id,name,age
From Student
Where age < 15
Union
Select id,name,age
From Student
Where Name like "%a%"
Order by name
Run Code Online (Sandbox Code Playgroud)

order by应用于完整的结果集

  • 如果我希望排序仅应用于UNION的顶部,该怎么办? (41认同)
  • @marifrahman看到我的答案http://stackoverflow.com/a/43855496/2340825 (7认同)
  • @marifrahman 很抱歉挖掘一个旧话题,但它可能对其他人有帮助。如果您希望将 ORDER BY 应用于 UNION 的第一部分,请用括号保护此 SELECT。 (4认同)

Mar*_*son 75

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
Run Code Online (Sandbox Code Playgroud)

  • 正如bernd_k所指出的,根据定义,组成UNION的各个SELECT不允许包含ORDER BY子句.允许的唯一ORDER BY子句位于UNION的末尾,它适用于整个UNION,使`xxx UNION yyy ORDER BY zzz`等效于`(xxx UNION yyy)ORDER BY zzz` (42认同)

BA *_*ber 32

为了使排序仅适用于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%"
Run Code Online (Sandbox Code Playgroud)

或者(解决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
Run Code Online (Sandbox Code Playgroud)

  • 是.这命令了subselect的结果.这不会命令引用该subselect的`select`语句的结果.根据SQL标准,结果的顺序是未定义的,除非有明确的`order by`子句.您示例中的第一个`select` _probably_以subselect返回的顺序返回其结果,但不保证.此外,_does*not*_保证整个`union`的结果集的排序(标准中的相同规则).如果你依赖订单,你最终会被咬伤. (2认同)
  • @AmitChigadani 消除重复不是原始问题的一部分,但为此可以修改 WHERE 子句以确保唯一性。例如:其中名称像“%a%”和年龄 &gt;= 15 (2认同)

Gen*_* S. 12

其他答案都是正确的,但我认为值得注意的是,我遇到的地方没有意识到你需要别名的命令,并确保两个选择的别名是相同的......所以

select 'foo'
union
select item as `foo`
from myTable
order by `foo`
Run Code Online (Sandbox Code Playgroud)

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

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

  • 第一个选择是一个文字;它是一个像“NAMES”这样的标题。第二个选择是对表的引用。因此,您的第一行将显示“NAMES”,其余行将是从表中选择的实际名称。要点是,您的标题很可能与您从中选择的列的名称相同,这是使用您想要的标签而不与您的联合发生冲突的解决方案。 (2认同)
  • 经过一些实验,我发现必须在SELECT子句中提到ORDER BY子句中提到的别名.您无法按其他列排序.当然,你可以通过将整个事物包装在`SELECT a,b,c FROM(<insert union query here>)AS x中来解决这个问题;`如果你真的想避免返回额外的列. (2认同)

Sun*_*mar 11

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
Run Code Online (Sandbox Code Playgroud)


a1b*_*b0r 9

如果我希望排序只应用于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
)
Run Code Online (Sandbox Code Playgroud)


小智 8

如其他答案所述,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
Run Code Online (Sandbox Code Playgroud)

因此解决方案是使用别名“ User_Name”:

Select Name as User_Name, Address for Employee 
Union
Select Customer_Name as User_Name, Address from Customer
order by User_Name; 
Run Code Online (Sandbox Code Playgroud)