關于update?set?from?where??
下面是這樣一個例子:
兩個表a、b,想使b中的memo字段值等于a表中對應id的name值 ??
? 表a:id,name ??
? ? ? ? ? ? 1 ? ? ? 王 ??
? ? ? ? ? ? 2 ? ? ? 李 ??
? ? ? ? ? ? 3 ? ? ? 張 ??
? 表b:id,ClientName???
??????????? 1 ? ? ? ??
? ? ? ? ? ? 2 ??
? ? ? ? ? ? 3 ??
(MS SQL Server)語句:update?? b??set?? ClientName???= ? a.name???from?? a,b???where ? a.id ? = ? b.id??
(Oralce)語句:update?? b??set?? (ClientName)???=??(SELECT name?FROM?a WHERE b.id = a.id)
(Mysql)語句::?UPDATE?A, B?SET?A1?=?B1,?A2?=?B2,?A3?=?B3 WHERE?A.ID?=?B.ID
update?set?from?語句格式
當where和set都需要關聯一個表進行查詢時,整個?update執行時,就需要對被關聯的表進行兩次掃描,顯然效率比較低。
對于這種情況,Sybase和SQL SERVER的解決辦法是使用UPDATE...SET...FROM...WHERE...的語法,實際上就是從源表獲取更新數據。
在 SQL 中,表連接(left join、right join、inner join 等)常常用于 select 語句,其實在 SQL 語法中,這些連接也是可以用于update?和 delete 語句的,在這些語句中使用 join 還常常得到事半功倍的效果。
Update?T_OrderForm?SET?T_OrderForm.SellerID =B.L_TUserID
FROM?T_OrderForm A?LEFT JOIN T_ProductInfo?? B?ON B.L_ID=A.ProductID
用來同步兩個表的數據!
Oralce和DB2都支持的語法:
UPDATE?A??SET?(A1,?A2,?A3)?=?(SELECT?B1,?B2,?B3?FROM?B?WHERE?A.ID?=?B.ID)
MS SQL Server不支持這樣的語法,相對應的寫法為:
UPDATE?A??SET?A1?=?B1,?A2?=?B2,?A3?=?B3??FROM?A?LEFT?JOIN?B?ON?A.ID?=?B.ID
個人感覺MS SQL Server的Update語法功能更為強大。MS SQL SERVER的寫法:
UPDATE?A?SET?A1?=?B1,?A2?=?B2, A3 = B3?FROM?A,?B?WHERE?A.ID?=?B.ID
在Oracle和DB2中的寫法就比較麻煩了,如下:
UPDATE?A?SET?(A1,?A2,?A3)?=?(SELECT?B1,?B2,?B3?FROM?B?WHERE?A.ID?=?B.ID)WHERE?ID?IN?(SELECT?B.ID?FROM?B?WHERE?A.ID?=?B.ID)
Mysql的寫法是:
UPDATE?A, B?SET?A1?=?B1,?A2?=?B2,?A3?=?B3 WHERE?A.ID?=?B.ID