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

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1

引发异常

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

有帮助吗?

解决方案

有时您需要在每个需要与 UNION 组合的部分中使用 ORDER BY

在这种情况下

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 field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1

我认为这可以很好地解释。

以下是使用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;

由于列名在两个“选择”之间是不同的。在语句中,通过它们在结果集中的位置引用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

<强>文件:

name
=============================
RTS.exe
thiny1.etl
thing2.elt
f.txt
tcpdump_trial_license (1).zip

<强>文件夹:

name
============================
Contacts
Desktop
Downloads
Links
Favorites
My Documents

所需输出:(首先选择第一个结果,即首先是文件夹)

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

SQL以实现预期的结果:

SELECT name 
FROM (
    SELECT 1 AS rank, name FROM Folders
    UNION 
    SELECT 2 AS rank, name FROM Files) dt
ORDER BY rank, name

以下是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;

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

(SELECT table1.field1 FROM table1 
UNION
SELECT table2.field1 FROM table2) ORDER BY field1 

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

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

(使用ALIAS)

这是我见过的最愚蠢的事情,但是它有效,你不能与结果争论。

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 覆盖 Select 语句中建立的 Order By ,使这个无法使用。

我能想到的唯一一个对我有用的解决方案是不使用联合,而是让查询单独运行然后处理它们。所以基本上,当你想 Order By

时,不要使用 Union

通过单独使用顺序,每个子集获得顺序,但不是整个集合,这是您想要将两个表联合起来的。

你应该使用这样的东西来拥有一个有序集:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top