2012-02-07 50 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