Oracle update 多表關聯更新

需求

有一個部門的表(dept),

  • 部門編號(deptno)
  • 部門員工數(emps)
  • 部門員工的總工資(income)

還有一個員工表(emp)

  • 員工編號(empid)
  • 所屬部門(deptno)
  • 工資(sal)

要求更新部門員工數和總工資數。

代碼

1.

update dept
	set(emps,income)=(
		select count(empid),sum(sal)
		from emp
		where emp.deptno=dept.deptno
		);

這樣整個表都會更新。
假設有這樣一個情況,公司有一個極其神祕的部門‘’混分小分隊‘’,部門人數和部門收入都有值。但爲了保護員工信息,員工表裏面就沒有該部門 的任何信息。
那上述查詢後,這個部門的值會被置爲空。

2.

那如何搞呢?
利用另外一張表更新本表:(表1中有值,但表2中沒有值,則不做修改)

update 表1 set 列名=(select 列名 from 表2 where 表1.列名=2.列名) 
       where exists (select 1 from 表2 where 表1.列名=2.列名)

按葫蘆畫瓢:

update dept
	set(emps,income)=(
		select count(empid),sum(sal)
		from emp
		where emp.deptno=dept.deptno
		)
	where exists (select 1 from emp where emp.deptno=dept.deptno)

這種情況就能解決。它只更新員工的部門編號部門的部門編號相對應的情況,不一致的情況就不更新,比如‘’混分小分隊‘’部門就沒有更新。


  • select 1 from 表名select * from 表名 作用上來說是沒有差別的,都是查看是否有記錄。但前者效率更高
  • 用exists代替in可以提高sql語句的執行效率

那麼,代碼select 1 from emp where emp.deptno=dept.deptno的意思是:
在emp表中,找出emp.deptno=dept.deptno的行,作爲查詢結果,然後select 1 ,即把這些具體的值變爲1.
查詢結果的行數沒有變,只有一列的值,都是1.
所以select 1 不涉及到具體的數值就可以查看是否有記錄,效率更高一些。


參考:https://www.cnblogs.com/kangkaii/p/8419088.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章