SQL查询 - 在UNION中使用Order By

Cur*_*che 83 sql sorting union ms-access sql-order-by

如何从两个表中提取数据时以编程方式对联合查询进行排序?例如,

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
Run Code Online (Sandbox Code Playgroud)

引发异常

注意:这是在MS Access Jet数据库引擎上尝试的

ajg*_*ing 118

有时您需要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
Run Code Online (Sandbox Code Playgroud)

  • 在SSMS中,您需要将子查询更改为"SELECT TOP 100 PERCENT",以便在子查询中使用`ORDER BY` (3认同)
  • 当顺序影响结果集时(如使用 Top x 时),对我有用 (2认同)

Ann*_*off 64

SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,这并不能完成您在原始问题中逻辑上要求的内容. (18认同)
  • @onedaywhen原作者希望连接两组有序的结果.`UNION`不允许这种情况发生.可能还有另一种构造可以做到这一点.可能没有.无论哪种方式,这个答案在技术上都没有完成作者的要求. (8认同)
  • @Ian Boyd:在SQL中,`ORDER BY`是游标的一部分,而`UNION`是对表进行操作,因此它们的代码无法工作.我看不出你如何从荒谬的代码中推断出OP的意图.考虑到SQL的`UNION`删除了重复:如果这些是你的"有序结果集"`{1,2,3} UNION {2,4,6}`结果是`{1,2,3,4, 6}`或`{1,3,2,4,6}`?我们不知道因为关于SQL而且未指定OP的"有序结果集"的并集是未定义的. (4认同)
  • @Ian Boyd:我理解你的观点,但是他们所提出的问题没有任何逻辑意义:联盟在集合和集合上运作没有秩序! (2认同)

Ans*_*ith 57

我认为这很好地解释了.

以下是使用ORDER BY子句的UNION查询:

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

由于两个"select"语句的列名不同,因此通过它们在结果集中的位置引用ORDER BY子句中的列更为有利.

在这个例子中,我们通过分类结果supplier_name/ company_name升序排列,并标示为的"ORDER BY 2".

supplier_name/ company_name字段在位置#2中的结果集.

摘自:http://www.techonthenet.com/sql/union.php


Ian*_*oyd 28

使用一个具体的例子:

SELECT name FROM Folders ORDER BY name
UNION
SELECT name FROM Files ORDER BY name
Run Code Online (Sandbox Code Playgroud)

文件:

name
=============================
RTS.exe
thiny1.etl
thing2.elt
f.txt
tcpdump_trial_license (1).zip
Run Code Online (Sandbox Code Playgroud)

文件夹:

name
============================
Contacts
Desktop
Downloads
Links
Favorites
My Documents
Run Code Online (Sandbox Code Playgroud)

期望输出:(首先选择第一个结果,即文件夹优先)

Contacts
Desktop
Downloads
Favorites
Links
My Documents
f.txt
RTMS.exe
tcpdump_trial_license (1).zip
thiny1.etl
thing2.elt
Run Code Online (Sandbox Code Playgroud)

SQL实现了预期的结果:

SELECT name 
FROM (
    SELECT 1 AS rank, name FROM Folders
    UNION 
    SELECT 2 AS rank, name FROM Files) dt
ORDER BY rank, name
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,这是最好的答案 (3认同)

Tod*_*ice 17

以下是2007年Northwind的一个例子:

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

在完成所有工会之后,ORDER BY子句只需要是最后一个语句.您可以将多个集合在一起,然后在最后一个集合之后放置一个ORDER BY子句.


Nic*_*ick 9

(SELECT table1.field1 FROM table1 
UNION
SELECT table2.field1 FROM table2) ORDER BY field1 
Run Code Online (Sandbox Code Playgroud)

工作?记住思考集.使用union获取所需的集合,然后对其执行操作.


Joh*_*McG 5

SELECT table1Column1 as col1,table1Column2 as col2
    FROM table1
UNION
(    SELECT table2Column1 as col1, table1Column2 as col2
         FROM table2
)
ORDER BY col1 ASC
Run Code Online (Sandbox Code Playgroud)