null =null
なので false
と評価されます 2つのフィールドが両方ともnull
であるかどうかを確認する必要があります 同等性チェックに加えて:
UPDATE table_one SET table_one.x = table_two.y
FROM table_two
WHERE
(table_one.invoice_number = table_two.invoice_number
OR (table_one.invoice_number is null AND table_two.invoice_number is null))
AND
(table_one.submitted_by = table_two.submitted_by
OR (table_one.submitted_by is null AND table_two.submitted_by is null))
AND
-- etc
合体
より読みやすい関数:
UPDATE table_one SET table_one.x = table_two.y
FROM table_two
WHERE
coalesce(table_one.invoice_number, '') = coalesce(table_two.invoice_number, '')
AND coalesce(table_one.submitted_by, '') = coalesce(table_two.submitted_by, '')
AND -- etc
ただし、デフォルト値( coalesce
の最後の引数)には注意する必要があります。 )。
データ型は列タイプと一致する必要があり(たとえば、日付を数値と比較しないようにするため)、デフォルトはデータに表示されないようにする必要があります
例: coalesce(null、1)=coalesce(1、1)
避けたい状況です。
更新(パフォーマンスに関して):
table_twoのシーケンススキャン
-これは、 table_two
にインデックスがないことを示しています。 。
したがって、 table_one
の行を更新すると 次に、 table_two
で一致する行を見つけます データベースは基本的に、一致するものが見つかるまですべての行を1つずつスキャンする必要があります。
関連する列にインデックスを付けると、一致する行をはるかに速く見つけることができます。
反対に、 table_one
の場合 インデックスがあると、更新が遅くなります。
このパフォーマンスガイド
:
役立つかもしれない同じガイドからの別の提案は次のとおりです:
たとえば、 table_one
id
次のようなものを追加できる列
and table_one.id between x and y
where
x
の値を変更して、クエリを数回条件付けて実行します およびy
すべての行がカバーされるようにします。
ANALYZE
を使用するときは注意が必要な場合があります EXPLAIN
のオプション 副作用のあるステートメントを処理する場合。