テーブルを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
*ブログの記事を参照してください:PDATE 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のオンラインマニュアル:UPDATE によると、私がそれを正しく読んだ場合、3番目の方法のみがDB2 for iSeries7のオプションです。 1番目の方法は、派生テーブル(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
注:iSeriesの場合、MERGE
にはINTO
が必要です(クレジット: Jeff Stevens )
したがって、UPDATEステートメントを調整するには、次のようになります。
UPDATE t1
SET a = (SELECT a
FROM t2
WHERE t2.b = t.b
)
WHERE b in (SELECT b
FROM t2
)
また、複数の列を更新するステートメントは次のようになります。
UPDATE t1
SET ( x, y, z ) =
(SELECT
x, y, z
FROM t2
WHERE t2.b = t1.b
)
WHERE b in
(SELECT
b
FROM t2
)