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, see below
あなたがそれを持っていたように、2つのテーブルの個々の行の間にリンクはありませんでした。すべての行はtable1からフェッチされます table2のすべての行に対して 。この場所のサブクエリ式は単一の値のみを返すことが許可されているため、これは(コストのかかる方法で)意味がなく、構文エラーも引き起こしました。
table2_idの2つのテーブルを結合することでこれを修正しました 。それを実際に2つをリンクするものに置き換えてください。
UPDATEを書き直しました table1に参加するには (FROMを使用 句)相関サブクエリを実行する代わりに、通常は桁違いに高速であるため。
また、table2.val2を防止します。 table1に一致する行が見つからない場合は、無効になります。 。代わりに、何も この形式のクエリでは、このような行に発生します。
FROMにテーブル式を追加できます プレーンなSELECTのようなリスト (テーブル、サブクエリ、セットを返す関数、...)。マニュアル:
from_list他のテーブルの列を
WHEREに表示できるようにするテーブル式のリスト 条件と更新式。これは、FROMで指定できるテーブルのリストに似ています。SELECTの句 声明。ターゲットテーブルはfrom_listに表示されてはならないことに注意してください 、自己参加を意図していない限り(この場合、from_listにエイリアスを付けて表示する必要があります) 。
最後のWHERE 句は何も変更しない更新を防ぎます-これは実際には常に良い考えです(ほぼ全額の費用がかかりますが、利益はなく、エキゾチックな例外が適用されます)。古い値と新しい値の両方がNOT NULLであることが保証されている場合 、次のように簡略化します:
AND t2.val2 <> t1.val1
- 複数の列でDISTINCTを選択するにはどうすればよいですか(またはできますか?