从Oracle12c开始,我们终于可以像这样使用SQL标准行限制子句了:
SELECT * FROM t FETCH FIRST 10 ROWS ONLY现在,在Oracle12.1中,在连接表时有一个非常烦人的限制。在使用row limiting子句时,在SELECT子句中不能有两个同名的列。例如,这提高了Oracle12.1中的ORA-00918
SELECT t.id, u.id FROM t, u FETCH FIRST 10 ROWS ONLYThis is a restriction is documented in the manual for all versions 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或窗口函数的“经典”分页。
然而,奇怪的是,包含不明确ID列的原始查询从Oracle12.2开始运行得很好。这是文档错误,还是没有文档记录的特性?
发布于 2018-12-05 18:34:24
在这种情况下,当您使用行限制子句时,Oracle在内部调用ROW_NUMBER()函数,其中在OVER子句中使用列名,如ROW_NUMBER OVER(ORDER BY ID)。正因为如此,你得到了ORA-00918 error。
发布于 2018-09-08 14:27:59
我注意到你有一个隐式连接。当显式加入时,问题是否会消失,这将是一件有趣的事情。我想知道Oracle是否在幕后进行基于id=id的连接,而不是使用您分配给它们的表别名。
这也可以解释修复这个问题的列别名。尝试显式连接;这可能会迫使oracle使用表别名,并解决它认为自己看到的歧义。
https://stackoverflow.com/questions/51768880
复制相似问题