web-dev-qa-db-ja.com

MS SQL Server開発者向けのiSeriesのUPDATE ... FROM ...構文

テーブルをSQL Serverの別のテーブルの値に更新する場合、次の構文を使用します。

UPDATE t1
SET t1.a = t2.a
FROM t1
INNER JOIN t2 ON t2.b = t1.b

そのためのiSeries 7構文は何でしょうか?

3
ajeh

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)がビューとして定義されている場合にも機能します。

10
ypercubeᵀᴹ

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

7
Fabricio Araujo

したがって、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
    )
0
WarrenT