1. 程式人生 > >SQL語句的寫法:Update、Case、 Select 一起的用法

SQL語句的寫法:Update、Case、 Select 一起的用法

修改資料,需要驗證後修改對應的資料,而驗證的欄位不再修改表中,就需要對多表進行查詢,花了些時間想出瞭如下辦法,感覺還是挺有用的,也挺過癮的,之前很少碰到這樣的,所以再次記錄下:

(此業務邏輯沒有詳細說明,如果你正在看這些,只需要看SQL的寫的語法,相信您能看懂,也希望對您有所幫助)

-----------------------------------------
--Update 與 Select 一起的用法
--Update 通過多表來修改資料
-----------------------------------------

--參考寫法1:
update B1 set strNum = strNum - B2.intNum
where strId in 
(select intId from B2 where B2.intId = B1.strId)

--參考寫法2:
update B1 set strNum = strNum - B2.intNum
from B1 inner join B2
on B2.intId = B1.strId

select * 
from pro_res_assign,pro_gantt_task
where pro_res_assign.task_id = pro_gantt_task.task_id
and pro_res_assign.resource_id = 'jxstar4918'

update pro_gantt_task 
set pro_gantt_task.responsible_id = pro_res_assign.user_id ,
	pro_gantt_task.responsible =  pro_res_assign.res_name
from pro_res_assign,pro_gantt_task
where pro_res_assign.task_id = pro_gantt_task.task_id
and pro_res_assign.resource_id = 'jxstar4918'


------------------------------
--最終完成的SQL
------------------------------
update pro_gantt_task 
set pro_gantt_task.responsible_id = (
		case when pro_res_assign.responsible_type = '1' then pro_res_assign.user_id else null end	
),
pro_gantt_task.responsible =  (
	case when pro_res_assign.responsible_type = '1' then pro_res_assign.res_name else null end	
)
from pro_res_assign,pro_gantt_task
where pro_res_assign.task_id = pro_gantt_task.task_id
and pro_res_assign.resource_id = 'jxstar4918'


--測試查詢
select res_type,user_id,res_name,task_id from pro_res_assign where resource_id = 'jxstar4918'
select responsible_id,responsible from pro_gantt_task


以下是WBS計劃反寫備份:
--select user_id,res_name,task_id from pro_res_assign where resource_id = ?
--update pro_gantt_task set responsible_id = ? ,responsible =  ? where task_id = ?


 這裡只對SQL Server2008 測試通過,不知道Oracle/Mysql 其他的資料庫還沒測試;