我尝试了下面给出的 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。我该如何做到这一点?
我尝试了下面给出的 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。我该如何做到这一点?
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
你真的不需要括号。可以直接排序:
SELECT *, 1 AS RN FROM TABLE_A
UNION ALL
SELECT *, 2 AS RN FROM TABLE_B
ORDER BY RN, COLUMN_1
不是 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 是一个任意数字。使用足够大的数字来捕获您需要的所有数据。
有时您需要执行以下操作:
根据排序从表 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
这是我能够绕过错误并为我工作的唯一方法。
SELECT * FROM (SELECT * FROM TABLE_A ORDER BY COLUMN_1)DUMMY_TABLE UNION ALL SELECT * FROM TABLE_B ORDER BY 2;
2 是这里的列号.. 在 Oracle SQL 中,您可以使用要对数据进行排序的列号
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