【发布时间】:2016-08-19 15:04:50
【问题描述】:
以下作品:
INSERT INTO BASE_TABLE
(
req,
desc,
ver
)
SELECT * FROM UPDATE_TABLE
minus
SELECT req, desc, ver FROM BASE_TABLE;
但是,这会导致错误(只是尝试再插入一个字段:'key'):
INSERT INTO BASE_TABLE
(
req,
desc,
ver,
key
)
SELECT * FROM UPDATE_TABLE
minus
SELECT req, desc, ver FROM BASE_TABLE,
SELECT CONCAT(req, ver) FROM UPDATE_TABLE;
错误:
PL/SQL:ORA-00903:无效的表名
尝试通过从 UPDATE 表中选择尚未在 BASE_TABLE 中的所有内容来将行插入到 BASE_TABLE 中。只是想添加“关键”字段。
最后一个 SELECT 似乎不合适并导致此错误。 'SELECT ...减去SELECT ...'是否等于一条语句,因此需要将第三条SELECT语句分开?但是怎么做呢?
【问题讨论】:
-
看看
MERGE- 当您需要比较INSERT的两个表时,它可能会好得多。 -
一些注意事项/问题:首先,您将不能使用
DESC和KEY作为列名(它们是无效的对象名,因为它们是Oracle 保留字)。在您的实际数据中,您可能有其他名称,但对于测试DESC和KEY将不起作用。然后,在 Oracle 中concat()非常有限(例如它只需要两个参数),你最好使用||操作符来做同样的事情。那么,你的req和ver是什么数据类型呢?如果不是字符数据类型,Oracle会隐式转换,是你想要的吗? -
另外,你连接 req 和 ver 没有分隔符;那是一种奇怪的钥匙。
req=1,ver=23将与req=12,ver=3具有相同的密钥 - 这是您需要的吗? -
感谢 mathguy,我看看 MERGE。把真名拿出来,当然是保留字了:)req是唯一值,这里应该不错。
-
我发布了两个解决方案(它们完全不同,所以我没有将它们显示为一个答案)。其中一个不使用 MERGE,它只是修复了您最初的尝试。 (我认为 - 我没有测试它。)
标签: oracle plsql oracle-apex