从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
This 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
列的原始查询从Oracle 12.2起可以很好地运行。这是文档错误还是未记录的功能?
答案 0 :(得分:1)
在这种情况下,当您使用行限制子句时,Oracle内部使用ROW_NUMBER()
子句中的列名像内部OVER
一样调用ROW_NUMBER OVER(ORDER BY ID)
函数。因此,您得到了ORA-00918 error
。
答案 1 :(得分:0)
我注意到您有一个隐式联接。明确加入该问题后问题是否消失将是很有趣的。我想知道Oracle是否在幕后基于id = id进行联接,而不使用您为其分配的表别名。
这也将解释解决该问题的列别名。尝试显式加入;可能会迫使oracle使用表别名并解决它认为看到的歧义。