通过加入它们来更新多个表中的不同列

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>

【讨论】:

以上是关于通过加入它们来更新多个表中的不同列的主要内容,如果未能解决你的问题,请参考以下文章

如果任何列与另一个表中的匹配行不同,如何插入行

插入多个文本文件

Mysql根据不同的行更新表中的行值

通过在不同的表中查找来更新 SQL 中的记录

加入多个字段,只过滤真正不同的行

Rails Transaction 更新多个数据库列