sql - 我可以使用 MERGE 语句通过一次操作在 2 个或多个表上使用插入、更新和删除子句吗?
问题描述
我在文档中找不到此信息,也无法在其他 Internet 资源中找到有关此操作可能性的任何信息。
解决方案
不,您不能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
推荐阅读
- angular - 为什么我的“multipart/form-data”标头不能阻止发送预检 (OPTIONS) 请求?
- python - python中随机列表的内联列表
- ios - 就 iOS 应用更新的可用性向用户提供建议
- javascript - 如果条件,如何在javaScript中组合多个“等于”?
- android - 如何配置 Android Studio 4.1.1 以使用过时的 Gradle 项目?
- html - 使用 CSS 将表格向右移动
- c++ - 如何调用仅参数化的类的复制构造函数
- python - 如何绘制带有 datetime.datetime 值的数据框列的图表
- javascript - 在元素的第二次、第三次等点击时播放不同的声音
- html - 使用引导程序 4 在 flex-fill 中垂直和水平居中 div