适用于 MS SQL Server 开发人员的 iSeries 的 UPDATE ... FROM ... 语法

aje*_*jeh 3 sql-server db2 iseries

当我想将一个表更新为 SQL Server 中另一个表中的值时,我将使用以下语法:

UPDATE t1
SET t1.a = t2.a
FROM t1
INNER JOIN t2 ON t2.b = t1.b
Run Code Online (Sandbox Code Playgroud)

iSeries 7 的语法是什么?

ype*_*eᵀᴹ 10

我不知道 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 ;
Run Code Online (Sandbox Code Playgroud)

在 (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 ;
Run Code Online (Sandbox Code Playgroud)

在 (SQL-Server 2008) SQL-Fiddle 测试

*请参阅博客文章:让我们弃用 UPDATE FROM!Hugo Kornelis 提到的地方):
...如果 SQL Server 与连接表中的多行匹配,则 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
  ) ;
Run Code Online (Sandbox Code Playgroud)

根据DB2 i series7在线手册:更新- 如果我读对了 - 只有第 3 种方式是 DB2 for iSeries7 中的一个选项。如果派生表 ( u) 已定义为视图,则第一种方法也将起作用。


Fab*_*ujo 7

尝试使用SQL2003 标准中的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
Run Code Online (Sandbox Code Playgroud)

注意:对于 iSeries,MERGE需要INTO(来源:Jeff Stevens