1

我有一个包含三列 ab c 的表 A。我想根据列 c 与另一个表 B 的连接将值插入到列 a 和 b

我正在使用以下查询

MERGE INTO A
USING
(SELECT * FROM B) **B**
ON (B.c=A.c)
WHEN MATCHED THEN
INSERT(a,b) VALUES(local_varialble,'STRING');

我收到以下错误

PL/SQL : ORA-00905 : MISSING KEYWORD

请帮忙 !!这个查询似乎总是很棘手

编辑:我发现在 ON 条件下使用 != 并使用 WHEN NOT MATCHED 完美编译.. 但我不知道它是否会产生正确的结果

4

3 回答 3

0

未经测试,但是,将您的 sql 更改为此

MERGE INTO A
USING
(SELECT * FROM B) B
ON (B.c=A.c)
WHEN MATCHED THEN
INSERT(a,b) VALUES(lorcal_varialble,'STRING');

我添加了

(SELECT * FROM B) B

到你的 sql

当你引用 using select 时,你应该像我一样给它起别名

于 2013-11-05T17:59:01.397 回答
0

我认为您需要先定义一个“merge_update_clause”(请参阅​​合并文档

像这样:

MERGE INTO A
USING (SELECT * FROM B) b
   ON (B.c = A.c)
 WHEN MATCHED THEN UPDATE SET ....
     DELETE WHERE ...
   WHEN NOT MATCHED THEN INSERT ...
于 2013-11-05T16:08:16.010 回答
0

你到底想在这里实现什么?A当表中的行之间存在连接时,您希望将一些数据插入到表AB,但您不使用列中的任何值B

合并不会像你写的那样工作,因为你必须在子句中有一个UPDATEorDELETE语句WHEN MATCHED THEN,你不能有一个INSERTthere。另一方面,在WHEN NOT MATCHED THEN子句中,您只能拥有 INSERT.

有关MERGE此处的更多信息:Oracle 文档 - MERGE 语句

如果您从=to更改!=,它将不起作用,因为那时您将INSERT在 的WHEN NOT MATCHED THEN部分中执行 an MERGE,并且您想要的是INSERT当记录之间存在匹配时。

所以,总而言之——你想达到什么目的?我认为你不应该MERGE在那种特殊情况下使用,而是使用一个简单INSERT的定义明确的条件,哪些行应该从哪里插入。

于 2013-11-05T19:03:44.947 回答