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) 已定义为视图,则第一种方法也将起作用。
尝试使用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)
| 归档时间: |
|
| 查看次数: |
15492 次 |
| 最近记录: |