gpt4 book ai didi

sql - Oracle 12c - 插入到选择查询中的列不明确,ORA-00918

转载 作者:行者123 更新时间:2023-12-05 08:39:20 26 4
gpt4 key购买 nike

我正在尝试使用单个语句执行多个插入以实现此目的我正在使用 Insert into select 语句。但是当两列在插入中具有相同的值时,我面临着。我收到的错误消息是 ORA-00918: column ambiguously defined

查询

INSERT INTO sample (
HOST,
TOTAL_PING,
TOTAL_UNAVAILABLE_PING
)

SELECT * FROM (

SELECT 'FR3158-73-1',
82,
82
FROM DUAL
UNION ALL

SELECT 'FR3158-76-2',
80,
10
FROM DUAL
)

问题出现在第一个 select 语句中,其中两个值是 82 和 82,如果我将一个值更改为有效的值。即使列值相同,我也不知道如何进行这项工作。

--- 更新 ---

表定义

CREATE TABLE sample
(
ID NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1) PRIMARY KEY,
HOST VARCHAR2(15 BYTE),
TOTAL_PING INTEGER,
TOTAL_UNAVAILABLE_PING INTEGER,
ADDED_ON TIMESTAMP(6) DEFAULT systimestamp
);

最佳答案

在这种情况下,您不需要子查询——如@Littlefoot 所示。但如果你这样做了,在更复杂的情况下,你可以通过在子查询中为列表达式设置别名来避免错误:

INSERT INTO sample (
HOST,
TOTAL_PING,
TOTAL_UNAVAILABLE_PING
)

SELECT * FROM (

SELECT 'FR3158-73-1' as host,
82 as total_ping,
82 as total_unavailable_ping
FROM DUAL
UNION ALL

SELECT 'FR3158-76-2',
80,
10
FROM DUAL
)
/

2 rows inserted.

问题是子查询本身得到隐含的列别名,从查询的第一个分支中的值派生:

SELECT 'FR3158-73-1',
82,
82
FROM DUAL
UNION ALL

SELECT 'FR3158-76-2',
80,
10
FROM DUAL

'FR3158-73- 82 82
----------- ---------- ----------
FR3158-73-1 82 82
FR3158-76-2 80 10

第二列和第三列都称为 “82”,这是 ORA-00918 提示的歧义,来自外部 select。如果您添加消失的别名:

SELECT 'FR3158-73-1' as host,
82 as total_ping,
82 as total_unavailable_ping
FROM DUAL
UNION ALL

SELECT 'FR3158-76-2',
80,
10
FROM DUAL

HOST TOTAL_PING TOTAL_UNAVAILABLE_PING
----------- ---------- ----------------------
FR3158-73-1 82 82
FR3158-76-2 80 10

这样外层查询就不再迷茫了。请注意,您只需要联合的第一个分支 ( usually, anyway ) 中的别名 - 在所有分支中使用别名并没有什么坏处,它们只会被忽略,但如果您手动创建这个。在这种情况下,实际的别名也无关紧要,它们必须是唯一的;具体来说,它们不必与您要插入的列相匹配 - 但如果它们匹配,则更容易理解。

如果按照@Littlefoot 显示的方式进行操作,则没有中间结果集 select,因此不需要评估派生名称(如果可以说它们存在的话) ), 所以看不到歧义 - 它纯粹是位置问题。

关于sql - Oracle 12c - 插入到选择查询中的列不明确,ORA-00918,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60109730/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com