Sql-Server

UPDATE … FROM … 用於 MS SQL Server 開發人員的 iSeries 語法

  • April 7, 2017

當我想將一個表更新為 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

引用自:https://dba.stackexchange.com/questions/57211