首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用row limiting子句复制Oracle查询中的列

使用row limiting子句复制Oracle查询中的列
EN

Stack Overflow用户
提问于 2018-08-09 21:52:50
回答 2查看 542关注 0票数 17

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

代码语言:javascript
复制
SELECT * FROM t FETCH FIRST 10 ROWS ONLY

现在,在Oracle12.1中,在连接表时有一个非常烦人的限制。在使用row limiting子句时,在SELECT子句中不能有两个同名的列。例如,这提高了Oracle12.1中的ORA-00918

代码语言:javascript
复制
SELECT t.id, u.id FROM t, u FETCH FIRST 10 ROWS ONLY

This is a restriction is documented in the manual for all versions 12.1, 12.2, 18.0

解决方法显然是为列添加别名

代码语言:javascript
复制
SELECT t.id AS t_id, u.id AS u_id FROM t, u FETCH FIRST 10 ROWS ONLY

或者求助于使用ROWNUM或窗口函数的“经典”分页。

然而,奇怪的是,包含不明确ID列的原始查询从Oracle12.2开始运行得很好。这是文档错误,还是没有文档记录的特性?

EN

回答 2

Stack Overflow用户

发布于 2018-12-05 18:34:24

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

票数 1
EN

Stack Overflow用户

发布于 2018-09-08 14:27:59

我注意到你有一个隐式连接。当显式加入时,问题是否会消失,这将是一件有趣的事情。我想知道Oracle是否在幕后进行基于id=id的连接,而不是使用您分配给它们的表别名。

这也可以解释修复这个问题的列别名。尝试显式连接;这可能会迫使oracle使用表别名,并解决它认为自己看到的歧义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51768880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档