我想通过进行两个联接来同时更新3个表的3列,并通过sdo.status = active选择:
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中可以这样做吗?我尝试了很多请求,没有一个更新考虑到加入。
我的表中没有主键/外键。
答案 0 :(得分:2)
不可能,至少不能直接这样做。
您可以尝试创建一个视图,在该视图上创建INSTEAD OF触发器,然后-在该视图中-更新单独的表。
这是一个基于斯科特表的示例。
查看:
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>