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を選択するにはどうすればよいですか(またはできますか?