我有一张表A,其中有三列a b c。我想基于列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完成后跟进它完全编译..但我不知道它是否会产生正确的结果
答案 0 :(得分:0)
我认为你需要首先定义一个“merge_update_clause”(见merge documentation)
像这样: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 ...
答案 1 :(得分: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时,您应该像我一样使用别名
答案 2 :(得分:0)
你到底想要达到什么目的?当表A
和A
中的行之间存在连接时,您希望将一些数据插入到表B
中,但不要使用B
列的列中的任何值
合并将不会像您编写它一样有效,因为必须在UPDATE
子句中包含DELETE
或WHEN MATCHED THEN
语句,那里不能有INSERT
。另一方面,在WHEN NOT MATCHED THEN
clasue中,您只能 INSERT
。
有关此MERGE
的更多信息:Oracle Documentation - MERGE Statement
如果您从=
更改为!=
,则无效,因为您将在INSERT
部分WHEN NOT MATCHED THEN
中执行MERGE
当记录之间存在匹配时,您想要的是INSERT
。
所以,总结一下 - 你想要达到什么目的?我认为你不应该在那种特殊情况下使用MERGE
,而是使用一个简单的INSERT
,它具有明确定义的条件,应插入哪些行以及从哪里插入。