基于内部联接oracle sql插入

时间:2013-11-05 15:55:36

标签: sql database oracle plsql oracle11g

我有一张表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完成后跟进它完全编译..但我不知道它是否会产生正确的结果

3 个答案:

答案 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)

你到底想要达到什么目的?当表AA中的行之间存在连接时,您希望将一些数据插入到表B中,但不要使用B列的列中的任何值

合并将不会像您编写它一样有效,因为必须UPDATE子句中包含DELETEWHEN MATCHED THEN语句,那里不能有INSERT。另一方面,在WHEN NOT MATCHED THEN clasue中,您只能 INSERT

有关此MERGE的更多信息:Oracle Documentation - MERGE Statement

如果您从=更改为!=,则无效,因为您将在INSERT部分WHEN NOT MATCHED THEN中执行MERGE当记录之间存在匹配时,您想要的是INSERT

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