web-dev-qa-db-ja.com

SQLは、あるテーブルのフィールドを別のテーブルのフィールドから更新します

2つのテーブルがあります。

A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]

Aは常にBのサブセットになります(Aのすべての列もBにあります)。

IDのすべての列について、Bのデータを使用して、Aの特定のAでレコードを更新します。このIDは、ABの両方に存在します。

UPDATE構文または列名を指定せずにそれを行う他の方法はありますか?"Aのすべての列を設定"

私はPostgreSQLを使用しているため、特定の非標準コマンドも受け入れられます(ただし、推奨されません)。

111
Nir

非標準の FROM 句を使用できます。

UPDATE b
SET column1 = a.column1,
  column2 = a.column2,
  column3 = a.column3
FROM a
WHERE a.id = b.id
AND b.id = 1
207
Scott Bailey

私は10年以上にわたってIBM DB2データベースを扱ってきましたが、現在はPostgreSQLを学習しようとしています。

PostgreSQL 9.3.4では動作しますが、DB2 10.5では動作しません:

UPDATE B SET
     COLUMN1 = A.COLUMN1,
     COLUMN2 = A.COLUMN2,
     COLUMN3 = A.COLUMN3
FROM A
WHERE A.ID = B.ID

注:主な問題はFROM原因であり、これはDB2およびANSI SQLでもサポートされていません。

DB2 10.5では動作しますが、PostgreSQL 9.3.4では動作しません:

UPDATE B SET
    (COLUMN1, COLUMN2, COLUMN3) =
               (SELECT COLUMN1, COLUMN2, COLUMN3 FROM A WHERE ID = B.ID)

最後に!PostgreSQL 9.3.4とDB2 10.5の両方で動作します:

UPDATE B SET
     COLUMN1 = (SELECT COLUMN1 FROM A WHERE ID = B.ID),
     COLUMN2 = (SELECT COLUMN2 FROM A WHERE ID = B.ID),
     COLUMN3 = (SELECT COLUMN3 FROM A WHERE ID = B.ID)
23
jochan

これは大きな助けです。コード

UPDATE tbl_b b
SET   (  column1,   column2,   column3)
    = (a.column1, a.column2, a.column3)
FROM   tbl_a a
WHERE  b.id = 1
AND    a.id = b.id;

完全に動作します。

括弧「」が必要であることに注意してください

From "tbl_a" a

それを機能させるために。

7
user2493970

必ずしもあなたが尋ねたものではありませんが、おそらくpostgresの継承を使用すると役立つかもしれませんか?

CREATE TABLE A (
    ID            int,
    column1       text,
    column2       text,
    column3       text
);

CREATE TABLE B (
    column4       text
) INHERITS (A);

これにより、Bを更新する必要がなくなります。

ただし、すべての details を必ずお読みください。

そうでなければ、あなたが求めるものは良い習慣とは見なされません-SELECT * ...を含むビューなどの動的なものは推奨されません(そのようなわずかな利便性は助けよりも多くのものを壊す可能性があるため)、そしてあなたが求めるものはUPDATE ... SETコマンド。

5
Unreason

あなたはこれを行うために動的SQLを構築して実行することができますが、それは本当に理想的ではありません

0
Daniel Brink