2012-02-07 100 views
2

我有两个表的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来更新部分内部联接操作;

回答

3

在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) 

正如你所看到的解决方案有很多,但受到限制。

+0

广东话它使用简单的内连接来完成????? – Tuscan 2012-02-07 11:08:01

+0

@UlhasTuscano,改进了显示其他方法的答案。 – Benoit 2012-02-07 11:28:35

+0

我得到了解决办法。感谢您的明确解释。 – Tuscan 2012-02-07 11:37:28

2
 
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 
     ) 
+0

是的。但如果员工无法在部门找到,将会失败。 – Benoit 2012-02-07 11:17:43

+1

'UNION ALL从1开始的双重选择中应该包含'NULLS LAST',但更简单的是'RIGHT JOIN dual ON 1 = 1' – Benoit 2012-02-07 11:40:15