クエリ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
。この場所のサブクエリ式は単一の値のみを返すことが許可されているため、これは (コストのかかる方法で) 意味がなく、構文エラーも引き起こしました。
で 2 つのテーブルを結合することで、これを修正しましたtable2_id
。それを実際に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