【问题标题】:INSERT-SELECT not working with FETCH NEXT [x] ROWS [closed]INSERT-SELECT 不适用于 FETCH NEXT [x] ROWS [关闭]
【发布时间】:2021-09-27 11:55:51
【问题描述】:

我有疑问

INSERT INTO MYTABLE(NAME,NUM)
SELECT NAME,NUM 
FROM DATA
INNER JOIN T3
ON MYTABLE.NUM = T3.NUM
ORDER BY MYTABLE.NUM
OFFSET 0 ROWS
FETCH NEXT 5 ROWS ONLY;

运行此程序会导致以下错误:

SQL 错误:ORA-00918:列定义不明确

但是当我在没有OFFSET 部分的情况下运行上面的查询时,它可以工作。

FETCHINSERT SELECT 不兼容吗?

【问题讨论】:

  • I cannot reproduce this。但是Oracle 11g根本没有这个子句,所以不管有没有offset都行不通
  • @astentx 我已更新查询以帮助重现
  • 嗯,你原来的问题和你的例子不一样。您需要完全限定对该列的每个引用,以便: 1) 为包括未来您在内的所有人提供查询的可支持性,当您问自己该列应该来自哪里时; 2) 允许查询有效而不管任何新的未使用的列; 3)当过滤器/连接中的列出人意料地来自另一个表时,避免意外且很难发现的错误。如果连接数据集中有两个 id 列,Oracle 应该如何知道使用哪一个?
  • 无论offset如何,您的示例都会失败

标签: sql oracle oracle11g


【解决方案1】:

是的,FETCHINSERT...SELECT 兼容。我将其发布为答案而不是评论,因为它是您发布的问题的答案。

ORA-00918FETCH 子句最常见的原因是选择列表中的所有变量都不能具有相同名称的警告。例如,这个SELECT 是合法的:

SELECT object_type, object_name, object_name
FROM   dba_objects
WHERE OBJECT_NAME LIKE 'USER%'
ORDER BY 1, 2

..这不是...

SELECT object_type, object_name, object_name
FROM   dba_objects
WHERE OBJECT_NAME LIKE 'USER%'
ORDER BY 1, 2
OFFSET 0 ROWS
FETCH NEXT 5 ROWS ONLY;

检查您的查询并确保所有列名/别名都是唯一的。

更新

查看您的 SQL Fiddle,这是一个花园品种 ORA-00918。它与您的INSERTFETCH 无关。您正在连接两个具有相同列的表,并且您没有指定要选择和排序的表。将您的声明更改为:

insert into t2(id, val)
select t.id, t.val
from t
inner join t3
on t.val=t3.val
order by t.id desc
offset 3 rows
fetch first 5 rows only

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 2022-01-11
    • 2021-02-09
    • 2013-04-22
    • 2016-01-12
    相关资源
    最近更新 更多