73

我尝试了下面给出的 sql 查询:

SELECT * FROM (SELECT * 
FROM TABLE_A ORDER BY COLUMN_1)DUMMY_TABLE
UNION ALL 
SELECT * FROM TABLE_B 

它会导致以下错误:

ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP 或 FOR XML。

我需要在 union all 中使用 order by。我该如何做到这一点?

4

6 回答 6

128
SELECT  * 
FROM 
        (
            SELECT * FROM TABLE_A 
            UNION ALL 
            SELECT * FROM TABLE_B
        ) dum
-- ORDER BY .....

但是如果您想从Table_A结果列表的顶部获取所有记录,您可以添加用户定义值,您可以将其用于排序,

SELECT  * 
FROM 
        (
            SELECT *, 1 sortby FROM TABLE_A 
            UNION ALL 
            SELECT *, 2 sortby FROM TABLE_B
        ) dum
ORDER   BY sortby 
于 2013-03-18T05:19:14.320 回答
49

你真的不需要括号。可以直接排序:

SELECT *, 1 AS RN FROM TABLE_A
UNION ALL 
SELECT *, 2 AS RN FROM TABLE_B
ORDER BY RN, COLUMN_1
于 2015-05-25T15:16:11.153 回答
32

不是 OP 的直接响应,但我想我会在这里响应 OP 的 ERROR 消息,这可能会完全指向另一个方向!

一旦检索到记录集并对批次进行排序,所有这些答案都指的是整体ORDER BY。

如果您想独立地按 UNION 的每个部分排序,并且仍然让它们“加入”在同一个 SELECT 中怎么办?

SELECT pass1.* FROM 
 (SELECT TOP 1000 tblA.ID, tblA.CustomerName 
  FROM TABLE_A AS tblA ORDER BY 2) AS pass1
UNION ALL 
SELECT pass2.* FROM 
  (SELECT TOP 1000 tblB.ID, tblB.CustomerName 
   FROM TABLE_B AS tblB ORDER BY 2) AS pass2

请注意,TOP 1000 是一个任意数字。使用足够大的数字来捕获您需要的所有数据。

于 2017-06-20T05:43:48.540 回答
0

有时您需要执行以下操作:

根据排序从表 1 中拉出前 5名,
根据另一种排序从表 2中拉出后 5 名,
然后将它们合并在一起。

解决方案

select * from (
-- top 5 records
select top 5 col1, col2, col3 
from table1 
group by col1, col2
order by col3 desc ) z 

union all

select * from (
-- bottom 5 records 
select top 5 col1, col2, col3 
from table2 
group by col1, col2
order by col3 ) z 

这是我能够绕过错误并为我工作的唯一方法。

于 2021-04-16T14:14:39.883 回答
0

SELECT * FROM (SELECT * FROM TABLE_A ORDER BY COLUMN_1)DUMMY_TABLE UNION ALL SELECT * FROM TABLE_B ORDER BY 2;

2 是这里的列号.. 在 Oracle SQL 中,您可以使用要对数据进行排序的列号

于 2021-05-14T19:58:44.903 回答
-3
select CONCAT(Name, '(',substr(occupation, 1, 1), ')') AS f1
from OCCUPATIONS
union
select temp.str AS f1 from 
(select count(occupation) AS counts, occupation, concat('There are a total of ' ,count(occupation) ,' ', lower(occupation),'s.') As str  from OCCUPATIONS group by occupation order by counts ASC, occupation ASC
 ) As temp
 order by f1
于 2020-10-13T13:36:22.740 回答