2つのテーブルがあります。
A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]
A
は常にB
のサブセットになります(A
のすべての列もB
にあります)。
ID
のすべての列について、B
のデータを使用して、A
の特定のA
でレコードを更新します。このID
は、A
とB
の両方に存在します。
UPDATE
構文または列名を指定せずにそれを行う他の方法はありますか?"Aのすべての列を設定"?
私はPostgreSQLを使用しているため、特定の非標準コマンドも受け入れられます(ただし、推奨されません)。
非標準の FROM 句を使用できます。
UPDATE b
SET column1 = a.column1,
column2 = a.column2,
column3 = a.column3
FROM a
WHERE a.id = b.id
AND b.id = 1
私は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)
これは大きな助けです。コード
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
それを機能させるために。
必ずしもあなたが尋ねたものではありませんが、おそらくpostgresの継承を使用すると役立つかもしれませんか?
CREATE TABLE A (
ID int,
column1 text,
column2 text,
column3 text
);
CREATE TABLE B (
column4 text
) INHERITS (A);
これにより、Bを更新する必要がなくなります。
ただし、すべての details を必ずお読みください。
そうでなければ、あなたが求めるものは良い習慣とは見なされません-SELECT * ...
を含むビューなどの動的なものは推奨されません(そのようなわずかな利便性は助けよりも多くのものを壊す可能性があるため)、そしてあなたが求めるものはUPDATE ... SET
コマンド。
あなたはこれを行うために動的SQLを構築して実行することができますが、それは本当に理想的ではありません