如何使用更新表内连接
问题描述:
我有两个表的Emp &部如何使用更新表内连接
SQL> select * from emp where rownum<4;
EMPNO ENAME JOB MGR SAL DEPTNO
---------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 800
7499 ALLEN SALESMAN 7698 1600
7521 WARD SALESMAN 7698 1250
SQL> select * from dept;
DEPTNO DNAME LOC EMPNO
---------- --------------- --------------- ----------
10 ACCOUNTING NEW YORK 7369
20 RESEARCH DALLAS 7499
30 SALES CHICAGO 7521
40 OPERATIONS BOSTON
我想更新DEPTNO EMP的应该是相同的deptno dept表&,其中EMPNO部门的应该是平等的对emp的empno;总之我想用emp来更新部分内部联接操作;
答
在Oracle中,规范的方式做到这一点是MERGE
声明:
MERGE INTO emp e
USING dept d
ON (d.empno = e.empno)
WHEN MATCHED THEN UPDATE SET e.deptno = d.deptno
但是,如果您使用的是Oracle 9以上将无法正常工作(见下文),或如果有域索引你表格(例如Oracle Text)
I asked a question previously关于MERGE语句的用法。
这是必要的e
每排由连接条件(ON
节)或无连接的d
正好1行,否则,你会得到ORA-30926“无法得到稳定的集行源表“。的e
行没有连接到任何部门获得不变,没有连接到任何员工的d
行可用于INSERTS
(和甲骨文9 必须在WHEN NOT MATCHED THEN INSERT(cols) VALUES(...)
子句中使用;如果你使用的是Oracle 9那么这个答案不适合你)。
另一种选择,但受制于相同的基本限制:
UPDATE (SELECT e.deptno edeptno, d.deptno ddeptno
FROM emp e, dept d
WHERE e.empno = d.empno)
SET edeptno = ddeptno
或者
UPDATE emp
SET deptno = (SELECT deptno FROM dept WHERE empno = emp.empno)
WHERE empno IN (SELECT empno FROM dept)
正如你所看到的解决方案有很多,但受到限制。
答
Update emp e set deptno = (select DEPTNO from dept d where d.empno = e.empno)
只要DEPT中的EMPNO是唯一的,它将工作。
编辑 - 正如指出的那样,如果EMPNO不存在,这将失败。
非常哈克修复此是,
更新EMPË
组DEPTNO =(
SELECT RESULT FROM ( select DEPTNO RESULT from dept d where d.empno = e.empno UNION ALL select NULL from DUAL ORDER BY 1 ) WHERE ROWNUM < 2 )
广东话它使用简单的内连接来完成????? – Tuscan 2012-02-07 11:08:01
@UlhasTuscano,改进了显示其他方法的答案。 – Benoit 2012-02-07 11:28:35
我得到了解决办法。感谢您的明确解释。 – Tuscan 2012-02-07 11:37:28