首页 > 解决方案 > 使用行限制子句在 Oracle 查询中重复列

问题描述

从 Oracle 12c 开始,我们终于可以像这样使用 SQL 标准行限制子句了:

SELECT * FROM t FETCH FIRST 10 ROWS ONLY

现在,在 Oracle 12.1 中,连接表时有一个非常烦人的限制。SELECT使用行限制子句时,子句中不可能有两列同名。例如,这会在 Oracle 12.1 中引发 ORA-00918

SELECT t.id, u.id FROM t, u FETCH FIRST 10 ROWS ONLY

这是所有版本 12.1、12.2、18.0 的手册中记录的限制

在此处输入图像描述

解决方法显然是对列进行别名

SELECT t.id AS t_id, u.id AS u_id FROM t, u FETCH FIRST 10 ROWS ONLY

ROWNUM或者使用或窗口函数诉诸“经典”分页。

不过,奇怪的是,从 Oracle 12.2 开始,带有模糊列的原始查询ID运行得很好。这是文档错误还是未记录的功能?

标签: sqloraclepagination

解决方案


在这种情况下,当您使用行限制子句时,Oracle 在内部使用子句 LikeROW_NUMBER()中的列名调用函数。正因为如此,你得到了.OVERROW_NUMBER OVER(ORDER BY ID)ORA-00918 error


推荐阅读