如何使用 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。那么maxnull,然后greatest 也将是null,不管amt 的值是什么。 @mathguy 你说得对,我在想什么

以上是关于如何使用 Union 、 Order By 和 Rownum?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQLite 使用 UNION ALL 和 ORDER BY 进行排序

UNION 和 ORDER BY 的使用不正确?

order by 和union all 如何共存

UNION ALL、UNION与ORDER BY

如何使用 UNION 组合两个具有 ORDER BY 的查询?

如何在 union all 中使用 order by