Sql-Server
UPDATE … FROM … 用於 MS SQL Server 開發人員的 iSeries 語法
當我想將一個表更新為 SQL Server 中另一個表的值時,我會使用以下語法:
UPDATE t1 SET t1.a = t2.a FROM t1 INNER JOIN t2 ON t2.b = t1.b
iSeries 7 的語法是什麼?
我不了解 iSeries7,但一些 DBMS(如 Oracle)允許這樣做——只要
t2 (b)
是唯一鍵或主鍵:UPDATE ( SELECT t1.a AS t1a, t2.a AS t2a FROM t1 INNER JOIN t2 ON t2.b = t1.b ) u SET t1a = t2a ;
在 (Oracle 11g) SQL-Fiddle測試
其他 DBMS 允許這種語法(例如 SQL-Server,它不會對唯一性大驚小怪,儘管這不是一件好事*):
WITH u AS ( SELECT t1.a AS t1a, t2.a AS t2a FROM t1 INNER JOIN t2 ON t2.b = t1.b ) UPDATE u SET t1a = t2a ;
在 (SQL-Server 2008) SQL-Fiddle測試
*請參閱部落格文章:**讓我們棄用 UPDATE FROM!**其中 Hugo Kornelis 提到):
……如果同一行匹配連接表中的多行,SQL Server 將愉快地一遍又一遍地更新,只有最後一個更新的結果會保留。…
您還可以檢查這種不使用 CTE 或可更新視圖的語法 - 因此幾乎可以在所有 DBMS 中使用:
UPDATE t1 SET a = ( SELECT t2.a FROM t2 WHERE t2.b = t1.b ) WHERE EXISTS ( SELECT * FROM t2 WHERE t2.b = t1.b ) ;
根據DB2 i series7 的線上手冊:更新——如果我沒看錯的話——在 DB2 for iSeries7 中只有第三種方式是一個選項。
u
如果派生表 ( ) 已定義為視圖,則第一種方法也可以使用。
嘗試使用 SQL2003 Standard 中的
MERGE
語句- 相當於UPDATE..SET..FROM
語法。例子:
MERGE INTO dbo.t1 AS Target USING (SELECT a,b,c FROM dbo.t2) AS Source ON (Target.b = Source.b) WHEN MATCHED THEN UPDATE SET Target.a = Source.a
注意:對於 iSeries,
MERGE
需要INTO
(來源:Jeff Stevens)