sql - 使用行限制子句在 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
运行得很好。这是文档错误还是未记录的功能?
解决方案
在这种情况下,当您使用行限制子句时,Oracle 在内部使用子句 LikeROW_NUMBER()
中的列名调用函数。正因为如此,你得到了.OVER
ROW_NUMBER OVER(ORDER BY ID)
ORA-00918 error
推荐阅读
- python - 单列到多列,列作为标题并填充二进制值
- firebase - 如何动态地将一组地图添加到云火库中?
- r - dplyr 包中的不同功能
- html - 如何在html中的链接中嵌入源站地址?
- azure - Azure - 创建多个具有静态地址的虚拟机 - 冲突
- c# - 如何从 Xamarin 表单中的其他页面动态更改 TabbedPage 的 backgroundColor
- sql-server - 如何使主键成为另一个表中的主键和 Microsoft SQL Server 中的 2 个字母的组合
- node.js - 打字稿编译错误 - TS2769:没有重载匹配此调用
- php - 在 PHP 中的控制器中包含模型函数
- r - 如果记录与其他数据框重复,则改变数据框