1つの列からすべての値をコピーしたいval1
テーブルのtable1
1列にval2
別のテーブルのtable2
。私はPostgreSQLでこのコマンドを試しました:
update table2
set val2 = (select val1 from table1)
しかし、私はこのエラーを受け取りました:
エラー:式として使用されるサブクエリによって複数の行が返されました
それを行う代替手段はありますか?
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
節は、何も変更しない更新を防ぎます-これは実際には常に良い考えです(コストはかかりますが、ゲインはありません-例外的な例外が適用されます)。table1を更新しますtable1_column = table2.column table2_table2からtable1_id = table2.id