web-dev-qa-db-ja.com

PostgreSQLのテーブルの列を別のテーブルの列で更新​​する

1つの列からすべての値をコピーしたいval1テーブルのtable1 1列にval2別のテーブルのtable2。私はPostgreSQLでこのコマンドを試しました:

update table2
set val2 = (select val1 from table1)

しかし、私はこのエラーを受け取りました:

エラー:式として使用されるサブクエリによって複数の行が返されました

それを行う代替手段はありますか?

24
f.ashouri

UPDATE クエリは次のようになります。

UPDATE table2 t2
SET    val2 = t1.val1
FROM   table1 t1
WHERE  t2.table2_id = t1.table2_id
AND    t2.val2 IS DISTINCT FROM t1.val1  -- optional, to avoid empty updates

あなたがそれを持っている方法では、2つのテーブルの個々の行の間にリンクがありませんでした。 table1のすべての行について、すべての行がtable2からフェッチされます。これは意味がありません(高価な方法で)。また、この場所のサブクエリ式は単一の値のみを返すことが許可されているため、構文エラーをトリガーしました。

  • table2_idの2つのテーブルを結合することでこれを修正しました。それを実際に2つをリンクするもので置き換えます。

  • 相関サブクエリを実行する代わりに、UPDATEを(FROM句を使用して)table1に結合するように書き直しました。
    また、table2.val2に一致する行が見つからない場合にtable1が無効になることを防ぎます。代わりに、 nothing は、この形式のクエリでこのような行に発生します。

  • プレーンなFROM(複数のテーブルやサブクエリなど)に含めることができるSELECTリストに同じものをすべて含めることができます。 ドキュメントごと:

from_list

テーブル式のリスト。他のテーブルの列をWHERE条件と更新式に表示できます。これは、FROMステートメントの SELECT Clause で指定できるテーブルのリストに似ています。ターゲットテーブルは、自己結合を意図しない限り、 from_list に表示されてはならないことに注意してください(この場合、- from_list )。

  • 最後のWHERE節は、何も変更しない更新を防ぎます-これは実際には常に良い考えです(コストはかかりますが、ゲインはありません-例外的な例外が適用されます)。
58

table1を更新しますtable1_column = table2.column table2_table2からtable1_id = table2.id

  1. table1にはエイリアス名を使用しないでください。
  2. テーブルはtable1、table2です
0
Bharath Pateru