如何使用 Union 、 Order By 和 Rownum?
Posted
技术标签:
【中文标题】如何使用 Union 、 Order By 和 Rownum?【英文标题】:How to use Union , Order By and Rownum? 【发布时间】:2021-10-01 14:36:45 【问题描述】:要求:我想先执行联合。然后 Order By 然后选择 1 行。
select * from v$version;
--Oracle Database 12c Enterprise Edition Release 12.1.0.2.0
下面是我的桌子。
MyTable1
Amt | CreationDate
-----------------
100 | 01/01/2021
200 | 01/02/2021
50 | 10/01/2021
我的表2
Amt | CreationDate
-----------------
100 | 01/01/2021
200 | 01/02/2021
50 | 10/01/2021
SELECT amt
FROM (SELECT amt
FROM MyTable1
UNION
SELECT amt
FROM MyTable2
ORDER BY CreationDate DESC)
WHERE rownum = 1;
错误是:ORA-00904:CreationDate 无效标识符
我在 PL/SQL 代码中有这个查询。
【问题讨论】:
你的表中没有cst_amt
,你怎么能select
呢?无论如何:错误是由order by
引起的。您可以按不在select
子句中的列进行排序,但前提是查询没有集合论操作(如UNION
)。在UNION
的两个成员的select
子句中包含创建日期。
【参考方案1】:
致order by
CreationDate,它必须是您的select
的一部分
select amt
from (select amt, creationdate
from mytable
union
select cst_amt, creationdate
from mytable
order by creationdate desc)
where rownum = 1;
从你对代码的意图来看,我认为你可以这样做
select greatest(max(amt), max(cst_amt))
from mytable
where cst_amt is not not and amt is not null;
Oracle 12c 支持fetch
子句,所以你也可以修改它。
【讨论】:
第二个版本不起作用,例如,如果所有cst_amt
都是null
。那么max
是null
,然后greatest
也将是null
,不管amt
的值是什么。
@mathguy 你说得对,我在想什么以上是关于如何使用 Union 、 Order By 和 Rownum?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SQLite 使用 UNION ALL 和 ORDER BY 进行排序