通过联接将多个表中的不同列更新

时间:2019-12-30 18:18:30

标签: sql oracle sql-update

我想通过进行两个联接来同时更新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中可以这样做吗?我尝试了很多请求,没有一个更新考虑到加入。

我的表中没有主键/外键。

1 个答案:

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