通过加入它们来更新多个表中的不同列
Posted
技术标签:
【中文标题】通过加入它们来更新多个表中的不同列【英文标题】:Update different columns in multiple tables by joining them 【发布时间】:2019-12-30 18:18:30 【问题描述】:我想通过 sdo.status=active 进行两次连接和选择来同时更新 3 个表的 3 列:
select sdo.status, sc.status, sps.status from table1 sdo, table2 sc, table3 sps
where sdo.uuid_table1 = sc.uuid_table1
and sps.uuid_table3 = sc.table3
and sdo.status='active';
我的目标是像伪代码一样更新此选择的状态:
update set
sc.status='inactive',
sps.status='inactive',
sdo.status='inactive';
可以在 oracle 中做到这一点吗?我尝试了这么多请求,没有一个更新考虑加入。
我的表中没有主键/外键。
【问题讨论】:
您可能想通过 Google 搜索以下错误:ORA-01776。 【参考方案1】:不可能,至少不能直接。
您可以尝试创建一个视图,在该视图上创建一个 INSTEAD OF 触发器,然后在该视图中更新单独的表。
这是一个基于 Scott 表格的示例。
查看:
SQL> create or replace view v_emp_dept as
2 select e.deptno, d.dname, e.empno, e.ename, e.job, e.sal
3 from emp e join dept d on e.deptno = d.deptno;
View created.
而不是触发器:
SQL> create or replace trigger trg_iu_ved
2 instead of update on v_emp_dept
3 for each row
4 begin
5 update emp e set
6 e.ename = :new.ename,
7 e.job = :new.job,
8 e.sal = :new.sal
9 where e.empno = :new.empno;
10
11 update dept d set
12 d.dname = :new.dname
13 where d.deptno = :new.deptno;
14 end;
15 /
Trigger created.
测试:
SQL> select * from v_emp_dept where deptno = 10;
DEPTNO DNAME EMPNO ENAME JOB SAL
---------- -------------- ---------- ---------- --------- ----------
10 ACCOUNTING 7782 CLARK MANAGER 2450
10 ACCOUNTING 7839 KING PRESIDENT 5000
10 ACCOUNTING 7934 MILLER CLERK 1300
SQL> update v_emp_dept set ename = 'ClArK' where empno = 7782;
1 row updated.
SQL> select * From emp where deptno = 10;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7782 ClArK MANAGER 7839 09.06.81 2450 10
7839 KING PRESIDENT 17.11.81 5000 10
7934 MILLER CLERK 7782 23.01.82 1300 10
SQL>
【讨论】:
以上是关于通过加入它们来更新多个表中的不同列的主要内容,如果未能解决你的问题,请参考以下文章