首页 > 解决方案 > 我可以使用 MERGE 语句通过一次操作在 2 个或多个表上使用插入、更新和删除子句吗?

问题描述

我在文档中找不到此信息,也无法在其他 Internet 资源中找到有关此操作可能性的任何信息。

标签: sqloraclemerge

解决方案


不,您不能MERGE在一次操作中更改两个或多个表。

文档MERGE中的语法对于表格或视图只有一个气泡。从理论上讲,一个视图可以包含多个表,但不适用于这样的视图。MERGE

编辑:不,MERGE在连接多个表的视图上不起作用:

CREATE TABLE t1 (id NUMBER PRIMARY KEY, c1 VARCHAR2(30));
CREATE TABLE t2 (id NUMBER PRIMARY KEY REFERENCES t1(id), c2 VARCHAR2(30));
CREATE TABLE m  (id NUMBER PRIMARY KEY);
CREATE VIEW  v12 AS SELECT t1.id, t1.c1, t2.c2 FROM t1 JOIN t2 ON t1.id=t2.id;
INSERT INTO  t1 VALUES(1, 'BEFORE');
INSERT INTO  t2 VALUES(1, 'before');
INSERT INTO  m  VALUES(1);

SELECT * FROM v12;
ID C1     C2
1  BEFORE before

`MERGE` causes an error:

MERGE INTO v12 USING m ON (v12.id = m.id)
 WHEN MATCHED THEN UPDATE set c1='AFTER';

ORA-38106: MERGE not supported on join view or view with INSTEAD OF trigger.
*Action:   When using MERGE to modify a view, you must only specify a single
           table in the view, and the view cannot have an INSTEAD OF trigger.

但是,UPDATE有效,但前提是一个基础表受到影响:

UPDATE v12 SET c1='AFTER';
1 row updated.

UPDATE v12 SET c2='after';
1 row updated.

UPDATE v12 SET c1='AFTER', c2='after';
SQL Error: ORA-01776: cannot modify more than one base table through a join view

推荐阅读